Bagaimana saya bisa menentukan mengapa apt-get akan menginstal paket?

18

Pertanyaan ini mirip dengan Bagaimana saya bisa mengetahui mengapa suatu paket diinstal? , tetapi dalam kasus saya, saya ingin tahu sebelum menginstal sebuah paket, mengapa ia akan menginstal dependensi tertentu.

Jadi misalnya saya mungkin lari

sudo apt-get install superfoo

dan output akan mengatakan sesuatu seperti:

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

Dan ini mungkin daftar yang sangat besar. Dalam beberapa kasus saya akan melihat sesuatu yang akan diinstal yang tidak benar-benar masuk akal bagi saya mengingat apa yang saya instal, jadi saya ingin tahu mengapa ketergantungan khusus itu akan diinstal.

Dalam contoh di atas katakanlah saya ingin memahami mengapa libderpharus diinstal. Saya tahu bahwa entah bagaimana ada rantai ketergantungan di antara superfoodan libderptetapi daftar besar paket yang akan diinstal membuatnya sulit untuk melihat apa rantai ini.

Setelah saya tahu rantai ketergantungan, saya dapat memutuskan apakah saya benar-benar ingin menginstal paket asli atau tidak, dan / atau apakah saya harus menghubungi pengelola paket itu untuk melihat apakah mereka benar - benar perlu memiliki dependensi tersebut di sana.

pbouf77
sumber
Jika jawaban seseorang membantu Anda, maka pertimbangkan untuk menandainya sebagai jawaban yang diterima sehingga orang lain dapat dengan mudah menemukannya di masa depan. Ini juga merupakan cara sopan untuk berterima kasih kepada orang yang menjawab pertanyaan Anda karena telah membantu Anda.
Danatela

Jawaban:

14

Apa yang sebenarnya Anda tanyakan adalah "Bagaimana cara saya membuat diagram ketergantungan?" sehingga Anda dapat melihat paket mana yang menarik dependensi mana.

Anda mendapatkan dependensi teks dan diagram dari apt-cacheperintah (termasuk dalam paket apt, bagian dari instalasi default).

Berikut adalah contoh apt-cache untuk daftar dependensi dari paket 'halo' dalam format teks. Output teks akan selalu hanya satu level.

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

Anda dapat membaca diagram menggunakan dotfile viewer, seperti dotty(termasuk dalam paket graphviz, juga bagian dari pemasangan default)

Berikut adalah contoh untuk mendapatkan pohon ketergantungan penuh dalam format grafis, lalu menampilkannya. Output grafis akan selalu menjadi pohon lengkap.

$ apt-cache dotty hello > dotfile
$ dotty dotfile

Melihat itu, Anda dapat melihat bahwa paket 'halo' menarik banyak paket Perl ... dan ketergantungan mana yang melakukannya.

pengguna535733
sumber
Sementara itu akan berhasil, itu akan menjadi pekerjaan yang serius untuk melakukannya dengan cara ini untuk melihat apa yang menarik dalam paket tertentu jika paket tersebut merupakan ketergantungan dari suatu ketergantungan.
tgm4883
Tidak semuanya. Hanya melihat gambar dotfile.
user535733
1
apt-cache depends --recurseakan memberi Anda gambaran lengkap, tetapi apt-rdepends di bawah ini lebih baik karena hanya mengikuti dependensi yang sebenarnya, yang tidak disarankan atau yang disarankan.
mhsmith
Meskipun apt-get sebenarnya akan menginstal dependensi yang disarankan kecuali Anda menggunakan --no-install-recommendsflag.
mhsmith
2
Apa arti bilah itu? |
CMCDragonkai
9

apt-rdependsmelakukan ini, tanpa menginstal 50+ perpustakaan cruft like 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)

Di instal server ubuntu saya yang bersih, apt-rdependshanya diperlukan libapt-pkg-perluntuk instalasi. Ini jauh lebih ringan ubuntu-dev-tools, namun masih bersifat rekursif, jadi Anda mendapatkan semua dependensi, alih-alih hanya dependensi orde pertama, seperti apt-cache dependspengembalian.

Nama palsu
sumber
Maaf jika saya salah paham, tapi saya pikir apt-rdepends tidak sama dengan reverse-depend. apt-rdepends mencantumkan dependensi rekursif dari suatu paket, sementara reverse-depend mencantumkan paket yang bergantung pada paket yang diberikan.
rsuarez
apt-rdepends -r mencantumkan dependensi terbalik.
Keith
8

Mungkin ada cara yang lebih mudah untuk melakukan ini, tetapi itu bisa dilakukan jika Anda menggunakan reverse-depend. Anda harus menginstal paket ubuntu-dev-tools dengan melakukan

apt-get install ubuntu-dev-tools

Atau dengan mengklik tombol ini:

Instal melalui pusat perangkat lunak

Setelah diinstal, Anda dapat menggunakan reverse-depend untuk melihat apa yang tergantung pada paket tertentu. Misalnya, jika Anda mencoba menginstal sesuatu yang ingin menginstal banyak paket tambahan dan Anda ingin melihat mengapa "libsmpeg0" sedang diinstal, Anda menjalankan

reverse-depends libsmpeg0

Yang akan menampilkan berikut ini.

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

Lihatlah dan lihat apakah paket yang ingin Anda instal ada dalam daftar itu. Jika tidak, maka salah satu paket yang ditarik saat instalasi awal akan muncul di daftar itu, dan Anda perlu menjalankan mundur-tergantung pada paket itu. Akhirnya Anda akan melihat paket awal yang ingin Anda instal dalam daftar itu. Pada titik itu, Anda harus memiliki rantai yang menunjukkan dengan tepat mengapa paket itu diinstal.

Sebagai catatan tambahan, saya percaya rekomendasi aktif secara default, jadi jika sesuatu ditetapkan sebagai rekomendasi maka akan ditarik ke. Menyarankan jika mati, tetapi ketergantungan-terbalik dapat menunjukkan info itu juga.

tgm4883
sumber
2
Meskipun saya yakin jawaban ini akan berhasil, itu melambangkan masalah yang OP berusaha hindari. ubuntu-dev-toolshasil dalam paket-paket berikut sedang diinstal. 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
Nama Palsu
2
[lanjutan] 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 (Catatan: Di atas hanyalah paket-paket yang diperlukan dari sudo apt-get install ubuntu-dev-toolscontoh server ubuntu yang cukup bersih). Jika Anda berusaha menghindari memasang cruft dalam jumlah besar, ini mungkin solusi terburuk yang mungkin.
Nama Palsu