Bỏ qua tất cả các phụ thuộc cho một gói cụ thể với apt-get


16

Đây là một câu hỏi rất cụ thể mà google không giúp trả lời.

Tôi đang chạy Ubuntu 13.04 với apt 0.9.7.7ubuntu4 for amd64 compiled on Oct 3 2013 15:25:56.

Tôi muốn cài đặt Erlang từ gói .deb, nhưng tôi không muốn lấy tất cả các phụ thuộc của nó. Gói chính nó xác định rằng nó phụ thuộc vào các thư viện Java và wx, nhưng trong thực tế, chúng không cần thiết trừ khi bạn muốn giao diện với Java hoặc wxWidgets.

Tôi có thể cài đặt Erlang như thế này

sudo dpkg -i --force-depends erlang.deb

Tuy nhiên, cài đặt bất cứ thứ gì khác apt-getsau đó đều thất bại vì phụ thuộc không được đáp ứng. Vì vậy, nếu tôi muốn cài đặt git sau Erlang, tôi nhận được những điều sau đây

$ sudo apt-get install -y git
Reading package lists...
Building dependency tree...
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
 esl-erlang : Depends: default-jre-headless but it is not going to be installed or
                       java2-runtime-headless or
                       java1-runtime-headless or
                       java2-runtime or
                       java1-runtime
              Depends: libwxbase2.8-0 but it is not going to be installed
              Depends: libwxgtk2.8-0 but it is not going to be installed
              Recommends: erlang-mode but it is not going to be installed
 git : Depends: libcurl3-gnutls (>= 7.16.2-1) but it is not going to be installed
       Depends: perl-modules but it is not going to be installed
       Depends: liberror-perl but it is not going to be installed
       Depends: git-man (> 1:1.7.9.5) but it is not going to be installed
       Depends: git-man (< 1:1.7.9.5-.) but it is not going to be installed
       Recommends: patch
       Recommends: rsync
       Recommends: ssh-client
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

Có cách nào để làm cho esl-erlanggói im lặng mà không chạy apt-get install -f?

Tôi muốn một cái gì đó như thế này:

sudo apt-get install --ignore-deps-for-package=esl-erlang git

hoặc như thế này:

sudo apt-cache shut-package-up esl-erlang

hoặc này:

sudo apt-get download git
sudo dpkg -i --with-deps git.deb

Tôi đã tìm thấy một câu hỏi tương tự: /server/250224/how-do-i-get-apt-get-to-ignore-some-dependencies . Một vài câu trả lời cung cấp các bước thủ công tiện dụng để sửa đổi các phụ thuộc của các gói nhất định.

Tôi vẫn đang tìm kiếm một phương pháp tự động mạnh mẽ.


Bạn đã thử --nodeps( apt-get) hay --ignore-dependsvới dpkg?
Mike Koch

Câu trả lời:


27

Tôi hiểu quan điểm của bjanssen, nhưng có vẻ nực cười khi người quản lý gói cho phép --force-dependscài đặt một gói duy nhất, nhưng không cho phép phụ thuộc vào lực lượng phụ thuộc mãi mãi và dừng lại cảnh báo cho tôi về sự phụ thuộc này.

Tôi gặp vấn đề tương tự với gói phụ thuộc vào phiên bản libcairo cao hơn một chút so với gói hiện có trong Debian. Đối với mục đích của tôi, nó vẫn hoạt động tốt. Tôi rất vui khi tiếp tục sử dụng nó cho đến khi bản cập nhật libcairo xuất hiện trong apt. Tôi không muốn biên dịch từ nguồn hoặc xây dựng gói của riêng mình.

Giải pháp tôi tìm thấy:

  • chỉnh sửa /var/lib/dpkg/status,
  • tìm gói với các phụ thuộc bị hỏng
  • chỉnh sửa Depends:dòng để dừng gói khiếu nại.

Tôi cho rằng sẽ được ghi đè vào lần tiếp theo gói được cập nhật, nhưng đó chính xác là những gì tôi muốn.


2
Điều này là hoàn hảo, chỉ là những gì tôi cần để tạm thời khắc phục sự phụ thuộc PPA không chính xác!
Cas

2

Những gì bạn cố gắng làm là trái với mục đích của một người quản lý gói, cố gắng giữ một môi trường lành mạnh, nghĩa là bạn đang sử dụng công cụ sai cho công việc. Đừng cố phá vỡ apt-get.

Cách đúng đắn để giải quyết vấn đề của bạn là xây dựng gói của riêng bạn với các phụ thuộc phù hợp với bạn. Có một cách chính thức (khá liên quan: http://www.debian.org/doc/manuals/maint-guide/index.en.html ) và cách sử dụng nhanh và bẩn apt-build, hoặc cho các gói không có trong nguồn phân phối, checkinstall. Tất cả các gói sản xuất apt-get sẽ vui vẻ cài đặt.

Trong một lưu ý cuối cùng, bạn có thể đặt câu hỏi về sự khôn ngoan của người duy trì esl-erlang để bao gồm một số phụ thuộc nhất định, nhưng bạn không thể lỗi người quản lý gói cho hành vi dự định. Nếu bạn nghĩ rằng các phụ thuộc này là sai, bạn nên gửi một lỗi với gói.


Những gì bạn đã nói về "mục đích của người quản lý gói" về cơ bản là đúng, nhưng bạn cũng không nên khái quát hóa. Tôi muốn đưa ra một ví dụ: cần một ứng dụng libmng1. Nhưng tôi đã libmng2cài đặt VÀ một symlink được đặt thành libmng1.so. Làm việc một mối đe dọa, không bao giờ có bất kỳ vấn đề. Nhưng apt-getluôn luôn phàn nàn về "sự phụ thuộc chưa được đáp ứng". Vì vậy, chắc chắn có một lý do chính đáng để cố gắng tìm cách im lặng năng khiếu trong khía cạnh này. Vì mọi thứ đều hoạt động, nó chỉ tiếp tục phàn nàn về những thứ đơn giản không có vấn đề gì. Nó chỉ nhìn thấy những vấn đề mà họ không có. Và điều đó thật khó chịu.
cú pháp

Đây là một tình huống tò mò. Tôi đoán bạn đã cài đặt một gói từ một kho lưu trữ không phân phối? Trong trường hợp như vậy, hãy xem equivs"im lặng" apt-get mà không phá vỡ nó.
bjanssen

Vâng, nó có thể đã được như thế. Nhưng trên thực tế, đó không phải là ... Tôi chỉ đơn giản là cài đặt gói cũ hơn từ cùng một bản phân phối, vì vậy theo thuật ngữ Ubuntu tôi đã ở trên 15x, nhưng tôi đã cài đặt libmng1 từ 12.04 LTS.
cú pháp

0

Kiểm tra, nếu "proxy được sử dụng" trong apt.conflà phù hợp (nghĩa là phù hợp với mạng của bạn). Điều này cũng gây ra các vấn đề như vậy, vì các url sẽ không thể truy cập được.

Thông thường, nếu bạn sử dụng proxy, thì bạn /etc/apt/apt.confsẽ trông như sau:

Acquire::ftp::proxy "ftp://<user>:<password>@<ip>:<port>/";
Acquire::http::proxy "http://<user>:<password>@<ip>:<port>/";
Acquire::https::proxy "https://<user>:<password>@<ip>:<port>/";
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.