Hiệu quả của việc biên dịch từ nguồn trên các ứng dụng đã được cài đặt


8

Tôi sử dụng Ubuntu 12.04. Giả sử tôi đã cài đặt package xtừ kho lưu trữ (với tất cả các phụ thuộc của nó) tại phiên bản 1.7 nhưng tôi cần một số chức năng chỉ có trong phiên bản 1.8, vì vậy tôi tải xuống tar nguồn và biên dịch nó:

./configure  
make  
make install
  • Điều này có ghi đè lên các nhị phân 1.7 hiện có không?
  • Nếu các tệp nhị phân hiện có bị ghi đè, trình quản lý gói có phản ánh phiên bản mới (1.8) và có thể package xđược người quản lý gói cập nhật trong tương lai không?
  • Nếu package ycó một sự phụ thuộc của package x 1.8- nó sẽ được thỏa mãn?

Tôi đã cố gắng tìm một nguồn trực tuyến tốt để giải thích điều này. Nếu bạn có bất kỳ kiến ​​nghị gì, vui lòng cho tôi biết.


Nếu bạn cố tình phá vỡ quản lý gói, những gì trên trái đất làm cho bạn nghĩ rằng nó sau đó sẽ nhận ra những gì bạn cài đặt?
Shadur

@Shadur Khía cạnh của câu hỏi này về cơ bản đi đến vấn đề điều gì xảy ra, chính xác là khi bạn cài đặt phần mềm từ nguồn sử dụng make install. Tôi nghĩ rằng rõ ràng từ câu trả lời mà về cơ bản tất cả những gì đang xảy ra là các tệp được sao chép vào các thư mục bên trong tiền tố cài đặt (mặc dù hóa ra điều này có khả năng một số tệp cấu hình có thể được đưa vào /etcvà một số dữ liệu có thể thay đổi động biểu thị ban đầu trạng thái của một cái gì đó có thể được đưa vào /var). Tuy nhiên, nếu bạn cảm thấy không rõ ràng, tôi rất vui lòng chỉnh sửa câu trả lời của tôi để giải thích.
Eliah Kagan

@EliahKagan Tôi chủ yếu là hùng biện cho Philip, ở đó.
Shadur

Câu trả lời:


12

Phần lớn các .debgói, cho dù chúng được cung cấp bởi các kho chính thức hay không, đều cài đặt với tiền tố /usr.

Điều đó có nghĩa là các tệp thực thi dự định được chạy bởi người dùng đi vào /usr/binhoặc /usr/sbin(hoặc /usr/gamesnếu đó là một trò chơi), các thư viện chia sẻ đi vào /usr/lib, dữ liệu chia sẻ độc lập với nền tảng đi vào /usr/share, các tệp tiêu đề đi vào /usr/includevà mã nguồn được cài đặt tự động đi vào /usr/src.

Một tỷ lệ nhỏ các gói sử dụng /làm tiền tố. Ví dụ, bashgói đặt bashtệp thực thi /bin, không /usr/bin. Đây là gói dành cho các gói cung cấp các yếu tố cần thiết để chạy ở chế độ một người dùng (như chế độ khôi phục) và để bắt đầu chế độ nhiều người dùng (nhưng hãy nhớ, thường bao gồm chức năng để gắn một số loại chia sẻ mạng ... trong trường hợp /usrlà một hệ thống tập tin từ xa).

Một tỷ lệ nhỏ các .debgói, chủ yếu là các gói được tạo bằng Quickly , tạo một thư mục dành riêng cho gói bên trong /optvà đặt tất cả các tệp của chúng ở đó. Ngoài ra, phần lớn thời gian /optlà vị trí được sử dụng bởi phần mềm được cài đặt từ trình cài đặt thực thi không sử dụng trình quản lý gói của hệ thống nhưng không liên quan đến việc biên dịch từ nguồn. (Ví dụ: nếu bạn cài đặt một chương trình độc quyền như MATLAB, bạn có thể sẽ đưa nó vào /opt.)

Ngược lại với tất cả những điều này, khi bạn tải xuống một kho lưu trữ nguồn (hoặc lấy mã nguồn từ hệ thống kiểm soát sửa đổi như Bazaar hoặc git), xây dựng và cài đặt nó, nó thường cài đặt vào tiền tố /usr/local(trừ khi bạn bảo nó làm nếu không thì). Điều này có nghĩa thực thi của bạn đi /usr/local/bin, /usr/local/libhoặc /usr/local/games, thư viện của bạn trong /usr/local/lib, và vân vân.

Có một số trường hợp ngoại lệ cho điều này - một số chương trình, theo mặc định, cài đặt vào /usrtiền tố và do đó sẽ ghi đè cài đặt của cùng một chương trình từ .debcác gói. Thông thường bạn có thể ngăn chặn điều này bằng cách chạy ./configure --prefix=/usr/localthay vì ./configurekhi bạn xây dựng chúng. Tôi một lần nữa nhấn mạnh rằng thường thì điều này là không cần thiết.

(Vì lý do này, việc bạn đặt mã nguồn mà bạn đang xây dựng sẽ rất hợp lý và sẽ cài đặt để sử dụng trên toàn hệ thống /usr/local/src, tồn tại cho mục đích đó.)

Giả sử phiên bản đóng gói được cài đặt /usrvà phiên bản bạn đã cài đặt từ nguồn là /usr/local:

  • Các tập tin từ gói đã cài đặt sẽ không bị ghi đè.

    Thông thường, phiên bản mới hơn sẽ chạy khi bạn gọi chương trình theo cách thủ công từ dòng lệnh (giả sử /usr/local/binhoặc bất cứ nơi nào các tệp thực thi được cài đặt nằm trong PATHbiến môi trường của bạn và xuất hiện trước thư mục /usr-prefixed tương ứng , chẳng hạn như /usr/bin).

    Nhưng có thể có một số vấn đề với những gì trình khởi chạy được tạo và có thể truy cập thông qua các menu hoặc tìm kiếm. Hơn nữa, nếu bạn đã cài đặt nhiều hơn một phiên bản của thư viện ở những nơi khác nhau, việc xác định phần mềm nào sẽ được sử dụng bởi phần mềm nào sẽ trở nên phức tạp hơn một chút.

    Nếu bạn không thực sự sử dụng cả hai phiên bản của chương trình hoặc thư viện, thì thường thì bạn nên xóa phiên bản mà bạn không sử dụng, mặc dù trong những tình huống hạn chế, bạn có thể muốn giữ một gói được cài đặt để đáp ứng phụ thuộc.

Tuy nhiên, nếu vì bất kỳ lý do nào, các tệp bị ghi đè (ví dụ: nếu mã nguồn được cài đặt /usrthay vì /usr/local):

  • Người quản lý gói sẽ không biết gì về cách thay đổi phần mềm. Nó sẽ nghĩ rằng phiên bản cũ được cài đặt. Vấn đề xấu có thể dẫn đến. Bạn nên tránh điều này. Nếu bạn đã tạo tình huống này, bạn nên gỡ cài đặt phần mềm bạn đã cài đặt từ nguồn (thường có sudo make uninstalltrong thư mục), sau đó gỡ cài đặt gói hoặc gói cung cấp các tệp bị ghi đè (vì chúng sẽ không được khôi phục bằng cách gỡ cài đặt phiên bản đã cài đặt từ nguồn). Sau đó cài đặt lại bất cứ phiên bản nào bạn muốn có./usr/local/src/program-or-library-name

Đối với việc hoàn thành các phụ thuộc:

  • Nếu có một .debgói phụ thuộc vào phần mềm bạn đã cài đặt từ nguồn và yêu cầu phiên bản bạn đã cài đặt từ nguồn (hoặc cao hơn), gói đó sẽ không cài đặt thành công. (Hoặc, chính xác hơn, bạn có thể "cài đặt" nó nhưng nó sẽ không bao giờ được "cấu hình" nên bạn sẽ không thể sử dụng nó.) Sự phụ thuộc được giải quyết bằng các phiên bản gói được cài đặt, không phải bởi phần mềm nào bạn thực sự có.

    Tương tự, phần mềm ít nhất sẽ cố gắng cài đặt hoàn toàn ngay cả khi bạn đã xóa thủ công các tệp được cung cấp bởi các gói mà phần mềm được cài đặt phụ thuộc vào. (Nói chung, bạn không nên cố gắng khai thác điều đó cho bất kỳ mục đích nào. Trình quản lý gói hoạt động dựa trên thông tin sai lệch hầu như luôn là một điều xấu.)

Do đó, nếu bạn không thể tìm thấy gói cung cấp phiên bản phần mềm bạn cần, bạn có thể cần tạo .debgói của riêng mình từ phần mềm bạn đã biên dịch và cài đặt từ gói đó. Sau đó, người quản lý gói sẽ biết những gì đang xảy ra. Tạo một gói để sử dụng cho riêng bạn, thứ mà bạn không cần phải hoạt động tốt trên máy tính của người khác, thực sự không khó lắm. (Nhưng tôi cảm thấy điều đó có thể nằm ngoài phạm vi câu hỏi của bạn, vì nó hiện đang được diễn đạt.)


Cảm ơn bạn đã phản hồi chi tiết, nó đã làm cho rất nhiều khái niệm rõ ràng
Philip D'Rozario

5

Những gì bạn cài đặt từ trung tâm phần mềm hoặc bằng lệnh APT ( apt-get, aptitude) hoặc dpkgđược biết đến với hệ thống quản lý gói. dpkglà công cụ thao tác gói cấp thấp, APT và bạn bè là các công cụ cấp cao hơn gọi dpkgđể thực hiện cài đặt thực tế và cũng xử lý các phụ thuộc và tải xuống gói.

Nếu bạn biên dịch một chương trình từ nguồn, trình quản lý gói sẽ không được biết đến. Quy ước về Linux, mà bạn nên tuân theo nỗi đau của việc khó theo dõi mọi thứ và cài đặt của bạn bị ghi đè, là:

  • /bin, /lib, /sbin, /usrĐược dành riêng cho người quản lý gói;
  • ngoại trừ đó /usr/locallà dành cho quản trị viên hệ thống - tôn trọng hệ thống phân cấp thư mục ở đó, nhưng bạn tự mình quản lý các tệp.

Xem cách tốt nhất để nâng cấp vim / gvim lên 7.3 trong Ubuntu 10.04? để biết danh sách các cách để có được các phiên bản phần mềm mới hơn. Cách dễ nhất là lấy PPA , nếu có. Nếu bạn nhận được gói nhị phân hoặc biên dịch từ nguồn, tôi khuyên bạn nên sử dụng stow để quản lý phần mềm được cài đặt thủ công của bạn. Ngoài ra, hãy tạo .debgói riêng của bạn - công việc sẽ hiệu quả hơn, nhưng sẽ thành công nếu bạn nâng cấp thường xuyên (thường làm lại gói cho phiên bản nhỏ tiếp theo rất nhanh) hoặc nếu bạn triển khai tới nhiều máy chạy cùng phân phối.

Với hầu hết các chương trình, nếu bạn chạy ./configure && make && sudo make install, chương trình được cài đặt bên dưới /usr/local. Đừng kiểm tra tài liệu được cung cấp với nguồn (thường là trong một tập tin gọi là READMEhay INSTALL) hoặc chạy ./configure --helpđể kiểm tra xem đây là trường hợp. Nếu chương trình được cài đặt bên dưới /usr/local, nó sẽ không can thiệp vào phiên bản do trình quản lý gói cung cấp. /usr/local/binđến đầu tiên trên hệ thống PATH. Lưu ý rằng bạn sẽ cần phải chạy make installvới tư cách quản trị viên (root); không biên dịch như root. Như đã lưu ý ở trên, tôi khuyên bạn nên sử dụng stow thay vì cài đặt trực tiếp vào /usr/local.


1

Điều này phụ thuộc vào gói và rất nhiều thứ khác

  1. quy ước đặt tên được sử dụng - nhị phân có chứa số phiên bản trong tên tệp
  2. cài đặt vị trí - theo mặc định trong opt, nhưng phiên bản đóng gói nằm trong / usr
  3. nhiều khả năng hơn

Câu chuyện dài:
Không có câu trả lời chung chung. Nó phụ thuộc rất nhiều vào gói. Bạn nên sử dụng PPA +1 chính thức nếu có thể thay vì biên dịch từ nguồn.


1
Điều này thực sự khá bất thường đối với các chương trình hoặc thư viện được biên dịch từ nguồn sẽ được cài đặt /opt. /usr/locallà tiền tố tiêu chuẩn và thậm chí /usrlà tiền tố mặc định phổ biến hơn /opt. /optĐược sử dụng phổ biến nhất cho phần mềm cài đặt bên trong một thư mục chuyên dụng có tên cho ứng dụng cụ thể (vì vậy, ví dụ, một ứng dụng có tên Foo có thể được cài đặt với tất cả các tệp của nó bên trong /opt/foo).
Eliah Kagan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.