Làm thế nào tôi có thể xác định tại sao apt-get sẽ cài đặt một gói?


18

Câu hỏi này tương tự như Làm thế nào tôi có thể tìm hiểu tại sao một gói được cài đặt? , nhưng trong trường hợp của tôi, tôi muốn biết trước khi thực sự cài đặt một gói, tại sao nó sẽ cài đặt một phụ thuộc cụ thể.

Vì vậy, ví dụ tôi có thể chạy

sudo apt-get install superfoo

và đầu ra sẽ nói một cái gì đó như:

The following extra packages will be installed:
  foo bar baz ... libderp libjunk

Và đây có thể là một danh sách thực sự lớn. Trong một số trường hợp, tôi sẽ thấy thứ gì đó sắp được cài đặt không thực sự có ý nghĩa đối với tôi khi tôi cài đặt, vì vậy tôi muốn biết tại sao sự phụ thuộc cụ thể đó sẽ được cài đặt.

Trong ví dụ trên, hãy nói rằng tôi muốn hiểu tại sao libderpsẽ được cài đặt. Tôi biết rằng bằng cách nào đó có một chuỗi các phụ thuộc giữa superfoolibderpnhưng danh sách lớn các gói sẽ được cài đặt làm cho khó thấy chuỗi này là gì.

Khi tôi biết chuỗi phụ thuộc, tôi có thể quyết định liệu tôi có thực sự muốn cài đặt gói ban đầu hay không, và / hoặc liệu tôi có nên liên lạc với người duy trì gói đó để xem họ có thực sự cần phải có các phụ thuộc đó không.


Nếu câu trả lời của ai đó hữu ích cho bạn, thì vui lòng xem xét việc đánh dấu nó là câu trả lời được chấp nhận để người khác có thể dễ dàng tìm thấy nó hơn trong tương lai. Đây cũng là một cách lịch sự để cảm ơn người trả lời câu hỏi của bạn đã giúp bạn.
Danatela

Câu trả lời:


14

Những gì bạn thực sự dường như đang hỏi là "Làm thế nào để tôi biểu đồ phụ thuộc?" Vì vậy, bạn có thể xem các gói kéo trong phụ thuộc.

Bạn nhận được cả phụ thuộc văn bản và sơ đồ từ apt-cachelệnh (được bao gồm trong gói apt, một phần của cài đặt mặc định).

Đây là một ví dụ về apt-cache để liệt kê các phụ thuộc của gói 'hello' ở định dạng văn bản. Đầu ra văn bản sẽ luôn chỉ có một cấp độ.

$ apt-cache depends hello
hello
  Depends: libc6
 |Depends: dpkg
  Depends: install-info

Bạn có thể đọc sơ đồ bằng bất kỳ trình xem dotfile nào, chẳng hạn như dotty(có trong gói graphviz, cũng là một phần của cài đặt mặc định)

Đây là một ví dụ về việc lấy cây phụ thuộc đầy đủ ở định dạng đồ họa, sau đó hiển thị nó. Đầu ra đồ họa sẽ luôn luôn là cây đầy đủ.

$ apt-cache dotty hello > dotfile
$ dotty dotfile

Nhìn qua, bạn có thể thấy gói 'xin chào' kéo theo rất nhiều gói Perl ... và phụ thuộc nào thực hiện nó.


Trong khi điều đó sẽ làm việc, nó sẽ là một công việc nghiêm túc để làm theo cách này để xem những gì đang kéo trong một gói nhất định nếu gói đó là một phụ thuộc của một phụ thuộc.
tgm4883

Không có gì. Chỉ nhìn vào hình ảnh dotfile.
dùng535733

1
apt-cache depends --recursesẽ cung cấp cho bạn bức tranh đầy đủ, nhưng apt -rdepends dưới đây là tốt hơn bởi vì nó chỉ tuân theo các phụ thuộc thực tế, không được đề xuất hoặc đề xuất.
mhsmith 23/2/2015

Mặc dù apt-get thực sự sẽ cài đặt các phụ thuộc được đề xuất trừ khi bạn sử dụng --no-install-recommendscờ.
mhsmith 23/2/2015

2
Thanh đó có nghĩa là gì? |
CMCDragonkai

9

apt-rdependslàm điều này, mà không cần cài đặt hơn 50 thư viện của cruft như ubuntu-dev-tools.

durr@scraper:~$ apt-rdepends mercurial
Reading package lists... Done
Building dependency tree
Reading state information... Done
mercurial
  Depends: libc6 (>= 2.14)
  Depends: mercurial-common (= 2.8.2-1ubuntu1)
  Depends: python (<< 2.8)
  Depends: ucf (>= 2.0020)
libc6
  Depends: libgcc1
libgcc1
  Depends: gcc-4.9-base (= 4.9-20140406-0ubuntu1)
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
gcc-4.9-base
multiarch-support
  Depends: libc6 (>= 2.3.6-2)
mercurial-common
  Depends: python (<< 2.8)
  Depends: python:any (>= 2.7.1-0ubuntu2)
python
  Depends: libpython-stdlib (= 2.7.5-5ubuntu3)
  Depends: python-minimal (= 2.7.5-5ubuntu3)
  Depends: python2.7 (>= 2.7.5-1~)
libpython-stdlib
  Depends: libpython2.7-stdlib (>= 2.7.5-1~)
libpython2.7-stdlib
  Depends: libbz2-1.0
  Depends: libc6 (>= 2.15)
  Depends: libdb5.3
  Depends: libexpat1 (>= 2.1~beta3)
  Depends: libffi6 (>= 3.0.4)
  Depends: libncursesw5 (>= 5.6+20070908)
  Depends: libpython2.7-minimal (= 2.7.6-8)
  Depends: libreadline6 (>= 6.0)
  Depends: libsqlite3-0 (>= 3.5.9)
  Depends: libssl1.0.0 (>= 1.0.0)
  Depends: libtinfo5
  Depends: mime-support
libbz2-1.0
  Depends: libc6 (>= 2.4)
  PreDepends: multiarch-support
libdb5.3
  Depends: libc6 (>= 2.17)
  PreDepends: multiarch-support
libexpat1
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
libffi6
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
libncursesw5
  Depends: libc6 (>= 2.15)
  Depends: libtinfo5 (= 5.9+20140118-1ubuntu1)
  PreDepends: multiarch-support
libtinfo5
  Depends: libc6 (>= 2.15)
  PreDepends: multiarch-support
libpython2.7-minimal
libreadline6
  Depends: libc6 (>= 2.15)
  Depends: libtinfo5
  Depends: readline-common
  PreDepends: multiarch-support
readline-common
  Depends: dpkg (>= 1.15.4)
  Depends: install-info
dpkg
  PreDepends: libbz2-1.0
  PreDepends: libc6 (>= 2.14)
  PreDepends: liblzma5 (>= 5.1.1alpha+20120614)
  PreDepends: libselinux1 (>= 2.1.0)
  PreDepends: tar (>= 1.23)
  PreDepends: zlib1g (>= 1:1.1.4)
liblzma5
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
libselinux1
  Depends: libc6 (>= 2.14)
  Depends: libpcre3
  PreDepends: multiarch-support
libpcre3
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
tar
  PreDepends: libacl1 (>= 2.2.51-8)
  PreDepends: libc6 (>= 2.17)
  PreDepends: libselinux1 (>= 1.32)
libacl1
  Depends: libattr1 (>= 1:2.4.46-8)
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
libattr1
  Depends: libc6 (>= 2.4)
  PreDepends: multiarch-support
zlib1g
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
install-info
  Depends: libc6 (>= 2.14)
  PreDepends: dpkg (>= 1.16.1)
libsqlite3-0
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
libssl1.0.0
  Depends: debconf (>= 0.5)
  Depends: debconf-2.0
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
debconf
  PreDepends: perl-base (>= 5.6.1-4)
perl-base
  PreDepends: dpkg (>= 1.14.20)
  PreDepends: libc6 (>= 2.14)
debconf-2.0
mime-support
python-minimal
  Depends: dpkg (>= 1.13.20)
  Depends: python2.7-minimal (>= 2.7.5-1~)
python2.7-minimal
  Depends: libpython2.7-minimal (= 2.7.6-8)
  Depends: zlib1g (>= 1:1.2.0)
  PreDepends: libc6 (>= 2.15)
python2.7
  Depends: libpython2.7-stdlib (= 2.7.6-8)
  Depends: mime-support
  Depends: python2.7-minimal (= 2.7.6-8)
python:any
ucf
  Depends: coreutils (>= 5.91)
  Depends: debconf (>= 1.5.19)
coreutils
  PreDepends: libacl1 (>= 2.2.51-8)
  PreDepends: libattr1 (>= 1:2.4.46-8)
  PreDepends: libc6 (>= 2.17)
  PreDepends: libselinux1 (>= 1.32)

Trên cài đặt máy chủ ub Ubuntu sạch của tôi, apt-rdependschỉ cần libapt-pkg-perlđể cài đặt. Sau đó ubuntu-dev-tools, nó nhẹ hơn nhiều , nhưng vẫn còn đệ quy, vì vậy bạn có được tất cả các phụ thuộc, thay vào đó chỉ là các phụ thuộc bậc nhất, như apt-cache dependstrả về.


Xin lỗi nếu tôi hiểu lầm, nhưng tôi nghĩ apt -rdepends không giống như ngược lại. apt -rdepends liệt kê các phụ thuộc đệ quy của gói, trong khi phụ thuộc ngược lại liệt kê các gói phụ thuộc vào gói đã cho.
rsuarez

apt -rdepends -r liệt kê các phụ thuộc ngược.
Keith

8

Có thể có một cách dễ dàng hơn để làm điều này, nhưng nó có thể được thực hiện nếu bạn sử dụng ngược lại. Bạn sẽ cần phải cài đặt gói ubfox-dev-tools bằng cách thực hiện

apt-get install ubuntu-dev-tools

Hoặc bằng cách nhấp vào nút này:

Cài đặt qua trung tâm phần mềm

Sau khi cài đặt, bạn có thể sử dụng đảo ngược phụ thuộc để xem những gì phụ thuộc vào một gói cụ thể. Ví dụ: nếu bạn cố gắng cài đặt một cái gì đó muốn cài đặt một loạt các gói bổ sung và bạn muốn xem tại sao "libsmpeg0" được cài đặt, bạn chạy

reverse-depends libsmpeg0

Mà sẽ xuất ra sau đây.

Reverse-Recommends
==================
* sandboxgamemaker

Reverse-Depends
===============
* btanks
* fenix-plugin-mpeg [armel armhf i386 powerpc]
* fillets-ng
* gltron [amd64 armel i386 powerpc]
* libalien-sdl-perl
* libsdl-perl [i386]
* libsmpeg-dev
* libtaoframework-sdl1.2-cil
* python-pygame
* ruby-sdl
* sdlbrt
* smpeg-gtv
* smpeg-plaympeg
* tdfsb

Packages without architectures listed are reverse-dependencies in: amd64, armel, armhf, i386, powerpc

Hãy xem và xem gói bạn muốn cài đặt có trong danh sách đó không. Nếu không, thì một trong những gói khác đang được kéo trong quá trình cài đặt ban đầu đó sẽ hiển thị trong danh sách đó và bạn sẽ cần chạy ngược lại - phụ thuộc vào gói đó. Cuối cùng, bạn sẽ thấy gói ban đầu bạn muốn cài đặt trong danh sách đó. Tại thời điểm đó, bạn nên có một chuỗi hiển thị chính xác lý do tại sao gói đó được cài đặt.

Như một ghi chú được thêm vào, tôi tin rằng các khuyến nghị được bật theo mặc định, vì vậy nếu một cái gì đó được đặt làm khuyến nghị thì nó sẽ được kéo vào. Đề xuất nếu tắt, nhưng phụ thuộc ngược lại cũng có thể hiển thị thông tin đó.


2
Mặc dù tôi chắc chắn rằng câu trả lời này sẽ hoạt động, nhưng nó nhân cách hóa vấn đề mà OP đang cố gắng tránh. ubuntu-dev-toolskết quả trong các gói sau được cài đặt. bzr bzr-builddeb dctrl-tools debian-archive-keyring debian-keyring debootstrap devscripts diffstat distro-info distro-info-data dput genisoimage gettext hardening-includes intltool-debian libapt-pkg-perl libarchive-zip-perl libasprintf-dev libassuan0 libauthen-sasl-perl libautodie-perl libclone-perl libcommon-sense-perl libcroco3 libdigest-hmac-perl libdistro-info-perl libemail-valid-perl libencode-locale-perl liberror-perl
Tên giả

2
[tiếp tục] python-launchpadlib python-lazr.restfulclient python-lazr.uri python-oauth python-paramiko python-reportbug python-secretstorage python-simplejson python-soappy python-support python-wadllib python3-debian python3-magic quilt reportbug t1utils unzip wdiff xdelta (Lưu ý: Trên đây chỉ là các gói bắt buộc từ sudo apt-get install ubuntu-dev-toolstrên một phiên bản máy chủ ub Ubuntu khá sạch). Nếu bạn đang cố gắng tránh cài đặt số lượng lớn hành trình, đây có lẽ là giải pháp tồi tệ nhất có thể.
Tên giả
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.