ฉันจะทราบได้อย่างไรว่าเหตุใด apt-get จึงจะติดตั้งแพ็คเกจ


18

คำถามนี้คล้ายกับฉันจะทราบได้อย่างไรว่าทำไมจึงมีการติดตั้งแพ็คเกจ แต่ในกรณีของฉันฉันต้องการที่จะรู้ก่อนที่จะติดตั้งแพคเกจจริงทำไมมันจะติดตั้งการพึ่งพาโดยเฉพาะ

ตัวอย่างเช่นฉันอาจทำงาน

sudo apt-get install superfoo

และผลลัพธ์จะพูดว่า:

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

และนี่อาจเป็นรายการใหญ่มาก ในบางกรณีฉันจะเห็นบางสิ่งบางอย่างที่กำลังจะถูกติดตั้งซึ่งไม่สมเหตุสมผลสำหรับฉันเมื่อฉันกำลังติดตั้งดังนั้นฉันจึงอยากรู้ว่าทำไมการติดตั้งแบบพึ่งพาเฉพาะ

ในตัวอย่างข้างต้นสมมติว่าฉันต้องการที่จะเข้าใจว่าทำไมlibderpจะติดตั้ง ฉันรู้ว่าอย่างใดมีห่วงโซ่ของการพึ่งพาระหว่างsuperfooและlibderpแต่รายการใหญ่ของแพคเกจที่จะติดตั้งทำให้มันยากที่จะเห็นว่าห่วงโซ่นี้คืออะไร

เมื่อฉันรู้ว่าห่วงโซ่การพึ่งพาที่ฉันสามารถตัดสินใจได้ว่าผมต้องการที่จะติดตั้งแพคเกจเดิมหรือไม่และ / หรือว่าฉันควรจะได้รับในการติดต่อกับผู้ดูแลของแพคเกจที่เพื่อดูว่าพวกเขาจริงๆจะต้องมีการพึ่งพาผู้มี


หากคำตอบของใครบางคนเป็นประโยชน์กับคุณโปรดพิจารณาการทำเครื่องหมายว่าเป็นคำตอบที่ยอมรับเพื่อให้ผู้อื่นสามารถค้นพบได้ง่ายขึ้นในอนาคต นี่เป็นวิธีที่สุภาพในการขอบคุณคนที่ตอบคำถามของคุณเพื่อช่วยเหลือคุณ
Danatela

คำตอบ:


14

สิ่งที่คุณดูเหมือนจะถามจริงๆคือ "ฉันจะแผนภาพพึ่งพาอาศัยกันได้อย่างไร" เพื่อให้คุณสามารถดูว่าแพคเกจใดที่ดึงการพึ่งพา

คุณได้รับข้อความและการอ้างอิงไดอะแกรมจากapt-cacheคำสั่ง (รวมอยู่ในแพ็คเกจ apt ซึ่งเป็นส่วนหนึ่งของการติดตั้งเริ่มต้น)

นี่คือตัวอย่างของ apt-cache สำหรับการแสดงรายการการขึ้นต่อกันของแพคเกจ 'hello' ในรูปแบบข้อความ เอาต์พุตข้อความจะมีเพียงหนึ่งระดับเท่านั้น

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

คุณสามารถอ่านไดอะแกรมโดยใช้โปรแกรมดูไฟล์ dotfile เช่นdotty(รวมอยู่ในแพ็คเกจ graphviz ซึ่งเป็นส่วนหนึ่งของการติดตั้งเริ่มต้น)

นี่คือตัวอย่างของการได้รับแผนภูมิการพึ่งพาแบบเต็มในรูปแบบกราฟิกจากนั้นแสดง เอาต์พุตแบบกราฟิกจะเป็นแผนผังแบบเต็มเสมอ

$ apt-cache dotty hello > dotfile
$ dotty dotfile

เมื่อมองดูแล้วคุณจะเห็นได้ว่าแพคเกจ 'hello' ดึงเข้ามาในแพ็คเกจ Perl จำนวนมาก ... และการพึ่งพาใดที่ทำได้


ในขณะที่ใช้งานได้มันจะเป็นงานที่หนักหน่วงที่จะทำเช่นนี้เพื่อดูว่ามีอะไรดึงอยู่ในแพคเกจบางอย่างถ้าแพ็กเกจเป็นการพึ่งพาการพึ่งพา
tgm4883

ไม่ใช่เลย. มองไปที่ภาพ dotfile
user535733

1
apt-cache depends --recurseจะให้ภาพเต็ม แต่เหมาะสำหรับผู้ที่ไม่ได้ลงทะเบียนข้างล่างนี้จะดีกว่าเพราะเป็นไปตามการอ้างอิงที่แท้จริงเท่านั้นไม่แนะนำหรือแนะนำ
mhsmith

แม้ว่า apt-get จริง ๆ แล้วจะติดตั้งการอ้างอิงที่แนะนำยกเว้นว่าคุณใช้--no-install-recommendsแฟล็ก
mhsmith

2
แถบนั้นหมายความว่าอย่างไร |
CMCDragonkai

9

apt-rdependsทำสิ่งนี้โดยไม่ต้องติดตั้งubuntu-dev-toolsไลบรารี่มากกว่า 50 ไลบรารี่

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)

ในการติดตั้งเซิร์ฟเวอร์ Ubuntu สะอาดของฉันapt-rdependsจำเป็นlibapt-pkg-perlสำหรับการติดตั้งเท่านั้น มันเบากว่ามากubuntu-dev-toolsและยังคงซ้ำซ้อนดังนั้นคุณจะได้รับการอ้างอิงทั้งหมดแทนที่จะเป็นเพียงการอ้างอิงลำดับแรกเช่นapt-cache dependsผลตอบแทน


ขออภัยถ้าฉันเข้าใจผิด แต่ฉันคิดว่า apt-rdepends นั้นไม่เหมือนกับ reverse-พึ่งพา apt-rdepends แสดงรายการการอ้างอิงซ้ำของแพ็กเกจในขณะที่ reverse-dependent แสดงรายการแพ็กเกจที่ขึ้นอยู่กับแพ็กเกจที่กำหนด
rsuarez

apt-rdepends -r แสดงรายการการย้อนกลับ
Keith

8

อาจมีวิธีที่ง่ายกว่าในการทำเช่นนี้ แต่สามารถทำได้หากคุณใช้การย้อนกลับ คุณจะต้องติดตั้งแพ็คเกจ ubuntu-dev-tools โดยทำ

apt-get install ubuntu-dev-tools

หรือโดยการคลิกที่ปุ่มนี้:

ติดตั้งผ่านศูนย์ซอฟต์แวร์

เมื่อติดตั้งแล้วคุณสามารถใช้ reverse-depend เพื่อดูสิ่งที่ขึ้นอยู่กับแพคเกจเฉพาะ ตัวอย่างเช่นหากคุณพยายามติดตั้งบางสิ่งที่ต้องการติดตั้งแพคเกจพิเศษจำนวนมากและคุณต้องการดูว่าทำไม "libsmpeg0" จึงถูกติดตั้งคุณจึงเรียกใช้

reverse-depends libsmpeg0

ซึ่งจะเอาท์พุทดังต่อไปนี้

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

ลองดูและดูว่าแพ็คเกจที่คุณต้องการติดตั้งนั้นอยู่ในรายการนั้นหรือไม่ ถ้าไม่เช่นนั้นแพคเกจอื่นที่ถูกดึงเข้ามาในระหว่างการติดตั้งครั้งแรกนั้นจะปรากฏขึ้นในรายการนั้นและคุณจะต้องรันการย้อนกลับ - ขึ้นอยู่กับแพ็คเกจนั้น ในที่สุดคุณจะเห็นแพ็คเกจเริ่มต้นที่คุณต้องการติดตั้งในรายการนั้น ณ จุดนั้นคุณควรมีลูกโซ่แสดงเหตุผลที่ถูกติดตั้งแพ็คเกจ

ในฐานะที่เป็นบันทึกเพิ่มเติมฉันเชื่อว่าการแนะนำเปิดอยู่ตามค่าเริ่มต้นดังนั้นหากมีการตั้งค่าบางสิ่งเป็นการแนะนำจะถูกดึงเข้าไป ชี้ให้เห็นว่าหากปิด แต่กลับขึ้นอยู่กับสามารถแสดงข้อมูลเช่นกัน


2
ในขณะที่ฉันแน่ใจว่าคำตอบนี้จะใช้งานได้มันเป็นปัญหาของ OP ที่พยายามหลีกเลี่ยง ubuntu-dev-toolsส่งผลให้มีการติดตั้งแพ็คเกจต่อไปนี้ 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
ชื่อปลอม

2
[ดำเนินการต่อ] 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 (หมายเหตุ: ข้างต้นเป็นเพียงแพ็คเกจที่จำเป็นจากsudo apt-get install ubuntu-dev-toolsบนอินสแตนซ์เซิร์ฟเวอร์ ubuntu ที่ค่อนข้างสะอาด) หากคุณพยายามหลีกเลี่ยงการติดตั้ง cruft จำนวนมากนี่อาจเป็นทางออกที่แย่ที่สุด
ชื่อปลอม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.