Làm thế nào để tôi có được apt-get để bỏ qua một số phụ thuộc?


86

Làm thế nào để tôi thực hiện apt-get bỏ qua một số phụ thuộc? Ví dụ: tôi muốn cài đặt mailx để tôi có thể sử dụng nó để gửi email từ các tập lệnh cron / công cụ tạo báo cáo. Tuy nhiên, cài đặt mailx cũng cài đặt exim4 và cả đống phụ thuộc (tôi đã cài đặt Postfix) Tôi không thực sự cần và tôi đoán mailx cũng có thể sống mà không cần.

Làm cách nào để bỏ qua một số phụ thuộc nhưng vẫn sử dụng apt-get vì đây là một công cụ hay?


Postfix được cài đặt như thế nào? thông qua gói debian? hoặc bạn đã cài đặt postfix từ nguồn?
hầm

Có, Postfix đã được cài đặt từ nguồn
FrancisV

3
Gói mailx của Debian chỉ 'đề xuất' exim4, không yêu cầu nó. Nếu bạn không muốn cài đặt các gói được đề xuất, chỉ cần thêm APT::Install-Recommends "false";vào của bạn apt.conf.
hủy hoại

Tôi đã tìm thấy một câu trả lời thỏa đáng cho vấn đề này tại unix.stackexchange.com; unix.stackexchange.com/a/404449/23542
artfulrobot

Câu trả lời:


45

Giải pháp đơn giản và dễ dàng: chỉ cần chỉ định các gói không mong muốn có thêm -sau mỗi gói .

Ví dụ không có công -tắc:

root@debian:~# apt-get install bsd-mailx 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  exim4-base exim4-config exim4-daemon-light liblockfile-bin liblockfile1
[...]

Ví dụ sử dụng công tắc để tránh cài đặt exim4-base . Lưu ý -ở cuối:

root@debian:~# apt-get install bsd-mailx exim4-base-
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package 'exim4-base' is not installed, so not removed
The following extra packages will be installed:
  liblockfile-bin liblockfile1 ssmtp
[...]

Như bạn có thể thấy, apt-getkhông thử cài đặt exim4-basegói nữa và nó không thử cài đặt các phụ thuộc khác nhau ( exim4-configv.v.).

Và nếu bạn đã sai và cần exim4-basesự phụ thuộc đó sau tất cả, bạn có thể chỉ apt-get installsau đó!


5
Đây là cách tốt nhất để tránh cài đặt bất kỳ phụ thuộc cụ thể. Các câu trả lời khác hoặc tránh cài đặt tất cả các phụ thuộc, gỡ cài đặt các phụ thuộc sau khi chúng được cài đặt hoặc đề xuất các gói chỉnh sửa tẻ nhạt.
Neil

1
Đây chính xác là những gì tôi cần! (cài đặt gnupg2mà không pinentry-gtk2tránh X deps)
lapo

Điều đó thực sự tuyệt vời, tuy nhiên, trong trường hợp của tôi, apt-get từ chối cài đặt gói với "phụ thuộc chưa được đáp ứng" (mà tôi đã chỉ định sử dụng phương pháp này). Cụ thể là gói tài liệu 100 megabyte mà tôi không quan tâm.
Rolf

3
Chỉ hoạt động với các phụ thuộc tùy chọn, không phải với những yêu cầu. Lỗi kiểm tra : Depends: xxx but it is not going to be installed. Bạn có thể bỏ qua tất cả các gói tùy chọn vớiapt-get install --no-install-recommends PACKAGE
koppor

Cũng không hoạt động với các gói ảo. Nhưng hãy xem unix.stackexchange.com/a/404449/23542
artfulrobot

55

Bạn có thể thay đổi các phụ thuộc của gói deb như thế này:

  1. Giải nén deb: ar x golden-linux.deb(sẽ tạo tức là ba tệp: debian-binary control.tar.gz data.tar.gz)
  2. Giải nén kho lưu trữ kiểm soát: tar xzf control.tar.gz(sẽ tạo: postinst postrm preinst prerm md5sums control)
  3. Khắc phục sự phụ thuộc trong control(sử dụng trình soạn thảo văn bản)
  4. Đóng gói lại control.tar.gz: tar --ignore-failed-read -cvzf control.tar.gz {post,pre}{inst,rm} md5sums control
  5. Đóng gói lại deb: ar rcs newpackage.deb debian-binary control.tar.gz data.tar.gz(thứ tự quan trọng! Xem [Lưu ý])

[Lưu ý]: dpkg sẽ không thể đọc siêu dữ liệu của gói một cách nhanh chóng nếu nó phải tìm kiếm nơi phần dữ liệu kết thúc!


2
Thật tuyệt, nó giải quyết cho tôi một trường hợp phụ thuộc đặc biệt cho "raring8" thành "raring6" nhưng cùng một phiên bản = (, rất cảm ơn
Felipe Alcacibar

1
Cảm ơn tôi cũng vậy; Tôi đã phải sử dụng điều này bởi vì một ứng dụng cần thiết libmng1.so.1mặc dù nó hoạt động hoàn hảo với một liên kết tượng trưng được đặt thành libmng1.so.2. apt-getchỉ không thể bị bịt miệng và làm tôi khó chịu về sự phụ thuộc không được đáp ứng (ngay cả khi cài đặt một cái gì đó hoàn toàn không liên quan!). Thật là một tải của khái niệm rác.
cú pháp

+1 Điều này làm việc hoàn hảo cho tôi là tốt. Gói gnome-settings-daemonmuốn gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11nhưng tôi đã có gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11.2(<- chú ý ".2" ở cuối). Quy trình này cho phép tôi chỉnh sửa gói và buộc nó sử dụng phiên bản 11.2 mới hơn. CẢM ƠN BẠN!
Eric Duncan

1
Giải pháp tuyệt vời, cảm ơn. Tôi đã sửa đổi bước 2 và 4 một chút: 2. FILES=$(tar zxvf control.tar.gz)để lưu danh sách tệp trong một biến. 4. tar zcf control.tar.gz $FILES- tạo kho lưu trữ trong một bước duy nhất mà không cần ống dẫn hoặc chuyển hướng bằng cách sử dụng danh sách tệp gốc (sau khi sửa đổi).
Brett

2
Một vài gợi ý khác. Đối với # 4: thêm --ignore-failed-readđể tarbỏ qua các tệp bị thiếu từ phần còn lại của dòng lệnh. (Ví dụ, prerm, postrmvắng mặt từ nhiều gói.) Ngoài ra, các tarball có thể .xzchứ không phải .gztrong các phiên bản mới hơn của định dạng lưu trữ Debian (ví dụ data.tar.xz).
Dan Lenski

33

Sau khi bạn cài đặt gói với --ignore-depends tùy chọn, hãy đi và chỉnh sửa /var/lib/dpkg/statustệp và xóa bất kỳ phụ thuộc nào bạn nghĩ là không cần thiết. Chỉ cần rất cẩn thận. Để một dep. được yêu cầu, nó là nhiều hơn khả năng để ĐƯỢC yêu cầu


3
Sau khi cập nhật /var/lib/dpkg/status, có thể cần phải hoàn tất cài đặt với sudo apt-get -f install(không cần chỉ định gói).
Zmicier Zaleznicenka

Cũng tìm thấy ở đây: superuser.com/a/815371/127024 .
Johann

Điều này mang lại cho tôi các creep, nhưng nó hoạt động hoàn hảo!
David Schmitt

25

Bạn có thể thử --nodepscờ với apt-get.
Hoặc tải gói và cài đặt bằng dpkgtùy chọn --ignore-depends.

Ví dụ: nếu bạn muốn cài đặt gói foomà không phụ thuộc bar:

dpkg --ignore-depends=bar -i foo_1.2.3_amd64.deb

52
Bạn có phiên bản APT nào? Của tôi ( 0.8.10 ) không có tùy chọn như vậy.
tshepang

8
nói với dpkg để bỏ qua các khoản giảm giá không phải là một lựa chọn cho anh ta. Nó chỉ bảo dpkg bỏ qua các phụ thuộc cho giao dịch NÀY, nó sẽ cố gắng thỏa mãn các phụ thuộc hoặc loại bỏ nhịp trong lần tiếp theo bạn làm bất cứ điều gì.
hầm

2
Vẫn không gặp may mắn với APT 0.8.16 BTW. Quá tệ vì dường như không có sự thay thế hợp lý. Phiên bản nào bạn đã sử dụng trở lại vào năm 2011 để làm cho nó hoạt động?
Christian

2
bạn có thể sử dụng tải xuống apt-get và sau đó dpkg
Frederick Roth

7
--no-install-recommendsđã làm cho tôi.
Olle Härstedt

14

Vì bạn đã cài đặt postfix từ nguồn, bạn cần cài đặt gói "giả", nó sẽ đáp ứng sự phụ thuộc của tác nhân vận chuyển thư của mailx (hoặc bsd-mailx). Gói "Equivs" trong debian tồn tại để tạo ra một gói giả như vậy mà bạn có thể cài đặt để nói với dpkg "sự phụ thuộc này được thỏa mãn"

Lý do nói với dpkg đơn giản là bỏ qua các phụ thuộc không phải là một giải pháp tốt, là vì bạn chỉ nói với dpkg / apt bỏ qua nó cho một giao dịch, bạn không thể bảo nó bỏ qua các phụ thuộc mãi mãi. Mỗi khi bạn sử dụng apt, nó sẽ kiểm tra các phụ thuộc trên tất cả các gói


2
Xem thêm câu trả lời này liên kết đến một hướng dẫn (mặc dù nó quá phức tạp) superuser.com/a/416560/128960 . Phiên bản ngắn là: chạy equivs-control <name>, chỉnh sửa tệp được tạo để cung cấp phụ thuộc đúng và có tên đẹp, sau đó chạy equivs-build <name>và cuối cùng dpkg -ilà tệp .deb kết quả.
Christian

1
IMHO đây thực sự là giải pháp tốt nhất. Tất cả các giải pháp khác được yêu cầu ở đây là một chút quá hackish. Điều này chỉ phải được thực hiện một lần và bạn có thể cài đặt bất kỳ phần mềm nào tùy thuộc vào phần mềm tự biên dịch sau đó ... Vì vậy, hãy đưa ra câu trả lời này!
rugk

7

Tôi đã tìm kiếm tùy chọn này trên Máy chủ Ubuntu 12.04 chạy Xen. Trong các miền của tôi, tôi sử dụng kernel -virtual và apt đã cố gắng cài đặt grub với mỗi lần nâng cấp gói kernel. Tuy nhiên, Grub không cần thiết bên trong domU khi sử dụng p [yv] grub.

Tôi cũng đang tìm kiếm tùy chọn -nodeps cho apt-get, nhưng nó không hoạt động, vì vậy cuối cùng đã gỡ cài đặt / thanh lọc grub * sau mỗi lần nâng cấp kernel.

Rốt cuộc, việc đọc một trang man đôi khi giúp ích - hóa ra một tùy chọn apt-get tương tự vào ngày 12.04 dường như là - không cài đặt-đề xuất, thực sự hoạt động trong trường hợp này, vì grub được liệt kê là 'được đề xuất' trong thông tin gói (tôi đoán vì vậy nó không phải là một phụ thuộc "thực sự"?).

Tôi đang thêm điều này vào đây bởi vì trong trường hợp của tôi, nó đã giải quyết được một vấn đề tương tự và gợi ý cho '--no-install-recommends' chưa được đề cập.


6

Bạn có thể tải xuống gói với apt-get và sau đó cài đặt nó với dpkg, liệt kê thủ công các phụ thuộc mà bạn muốn bỏ qua.

Ví dụ: nếu tôi muốn tải xuống gói của tôi nhưng nó phụ thuộc vào libperl5,14 và tôi không muốn cài đặt libperl5,14 vì tôi có một phiên bản khác, tôi có thể bỏ qua phần phụ thuộc này như sau:

apt-get download mypackage
dpkg -i --ignore-depends=libperl5.14 mypackage.deb

Chỉ cần đề cập rằng điều này sẽ khiến bạn apt "bị hỏng". Nó sẽ không cho phép bạn cài đặt các gói khác cho đến khi bạn khắc phục sự phụ thuộc bị thiếu.
drpexe

6

Một cách khác để tự điều chỉnh các phụ thuộc là:

apt-get download yourpackage
dpkg-deb -x yourpackage.deb PackageFolder
dpkg-deb --control yourpackage.deb PackageFolder/DEBIAN
vim PackageFolder/DEBIAN/control
dpkg -b PackageFolder yourpackage2.deb
apt-get install ./yourpackage2.deb

2

Trên hệ thống debian của tôi, bsd-mailx thực sự phụ thuộc vào default-mta | mail-transport-agent(bạn có thể kiểm tra xem gói nào phụ thuộc vào apt-cache show <pkg>bất cứ thứ gì trong kho lưu trữ hoặc dpkg -s <pkg>cho các gói đã cài đặt.

Có thể là gói postfix của bạn không có Provides: mail-transport-agentapt nên không nhận ra bạn đã cài đặt MTA. Sẽ là đáng để nộp một lỗi cho điều đó nếu đó là một gói chính thức.


1

Đối với mục đích này, bạn chỉ có thể cài đặt móng tay mà tôi không nghĩ có những phụ thuộc này?

apt-get install nail

-5

Vâng - không.

Sử dụng công việc của người khác là rất quan trọng trên con đường dẫn đến bất kỳ thành công nào. Khi bạn xây dựng một số phần mềm từ nguồn (tarball), bạn sẽ bỏ lỡ cơ hội sử dụng công việc của người quản lý gói phân phối.

Bạn sẽ không nhận được cập nhật "miễn phí". Hầu hết thời gian không ai cập nhật các gói họ cài đặt từ nguồn. Bởi vì họ cần theo dõi phần mềm cho các phiên bản mới, xây dựng lại nó và tất cả các chương trình phụ thuộc (cố gắng ghi nhớ chúng).

Bạn sẽ gặp vấn đề với các gói khác từ kho của nhà phân phối. Đây chính xác là trường hợp được nêu trong câu hỏi: ubfox có một trình quản lý gói tuyệt vời và một số người rất tốt đang duy trì các gói. Và họ đã quyết định, để chương trình mailx hoạt động, bạn cần có MTA. Vì vậy, nếu bạn đã cài đặt postfix từ các nguồn, Ubuntu sẽ không yêu cầu bạn cài đặt exim.

Nếu vì một lý do nào đó, việc bảo trì máy chủ chuyển sang người khác (ví dụ: dự án của bạn trở nên rất thành công và bạn quyết định thuê một người khác để quản lý máy chủ trong khi bạn đang bận rộn với những thứ khác) thì anh ta sẽ tự nhiên chạy dpkg --get-selectionsđể có được tất cả gói cài đặt.

Cố gắng sử dụng phần mềm quản lý gói của distro càng nhiều càng tốt. Tìm hiểu để xây dựng các gói của riêng bạn nếu bạn không thể tìm thấy một bản dựng sẵn và bạn sẽ trở thành một chuyên gia tốt hơn.

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.