Como posso determinar por que o apt-get instalará um pacote?

18

Esta pergunta é semelhante a Como posso descobrir por que um pacote foi instalado? , mas, no meu caso, gostaria de saber antes de instalar um pacote, por que ele instalará uma dependência específica.

Então, por exemplo, eu posso correr

sudo apt-get install superfoo

e a saída dirá algo como:

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

E essa pode ser uma lista realmente enorme. Em alguns casos, verei algo que será instalado que realmente não faz sentido para mim, considerando o que estou instalando, então quero saber por que essa dependência específica será instalada.

No exemplo acima, digamos que eu gostaria de entender por que libderpseria instalado. Eu sei que de alguma forma existe uma cadeia de dependências entre superfooe libderpmas a enorme lista de pacotes a serem instalados torna difícil ver o que esta cadeia é.

Depois de conhecer a cadeia de dependência, posso decidir se realmente quero instalar o pacote original ou não, e / ou se devo entrar em contato com o mantenedor desse pacote para ver se ele realmente precisa ter essas dependências.

pbouf77
fonte
Se a resposta de alguém foi útil para você, considere marcá-la como a resposta aceita para que outras pessoas possam encontrá-la mais facilmente no futuro. Essa também é uma maneira educada de agradecer à pessoa que respondeu à sua pergunta por ajudá-lo.
Danatela 15/04

Respostas:

14

O que você realmente parece estar se perguntando é "Como faço para diagramar dependências?" para que você possa ver quais pacotes extraem quais dependências.

Você obtém as dependências em texto e em diagrama do apt-cachecomando (incluído no pacote apt, parte da instalação padrão).

Aqui está um exemplo do apt-cache para listar dependências do pacote 'hello' em formato de texto. A saída de texto sempre será apenas um nível.

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

Você pode ler o diagrama usando qualquer visualizador de arquivos dotfile, como dotty(incluído no pacote graphviz, também parte da instalação padrão)

Aqui está um exemplo de como obter a árvore de dependência completa em formato gráfico e exibi-la. A saída gráfica sempre será a árvore completa.

$ apt-cache dotty hello > dotfile
$ dotty dotfile

Examinando, você pode ver que o pacote 'olá' gera uma tonelada de pacotes Perl ... e qual a dependência.

user535733
fonte
Enquanto isso funcionaria, seria um trabalho sério fazê-lo dessa maneira para ver o que estava puxando um determinado pacote se o pacote fosse uma dependência de uma dependência.
tgm4883
De modo nenhum. Apenas olhe para a imagem dotfile.
user535733
11
apt-cache depends --recursefornecerá uma imagem completa, mas o apt-rdepends abaixo é melhor porque segue apenas dependências reais, não recomendadas ou sugeridas.
mhsmith
Embora o apt-get realmente instale as dependências recomendadas, a menos que você use o --no-install-recommendssinalizador.
mhsmith
2
O que essa barra significa? |
precisa saber é o seguinte
9

apt-rdependsfaz isso, sem instalar mais de 50 bibliotecas de cruft 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)

Na minha instalação limpa do servidor ubuntu, apt-rdependsnecessária apenas libapt-pkg-perlpara a instalação. É muito mais leve ubuntu-dev-tools, e ainda assim é recursivo, então você obtém todas as dependências, e não apenas as dependências de primeira ordem, como apt-cache dependsdevoluções.

Nome falso
fonte
Desculpe se eu entendi errado, mas acho que apt-rdepends não é o mesmo que reverse-depende. O apt-rdepends lista as dependências recursivas de um pacote, enquanto o reverse-depende lista os pacotes que dependem do pacote fornecido.
rsuarez
O apt-rdepends -r lista as dependências reversas.
Keith
8

Pode haver uma maneira mais fácil de fazer isso, mas isso pode ser feito se você usar a dependência inversa. Você precisará instalar o pacote ubuntu-dev-tools fazendo

apt-get install ubuntu-dev-tools

Ou clicando neste botão:

Instale através do centro de software

Uma vez instalado, você pode usar o reverse-depende para ver o que depende de um pacote específico. Por exemplo, se você tentar instalar algo que deseja instalar um monte de pacotes extras e quiser ver por que "libsmpeg0" está sendo instalado, execute

reverse-depends libsmpeg0

O que produziria o seguinte.

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

Dê uma olhada e veja se o pacote que você deseja instalar está nessa lista. Caso contrário, outro pacote que está sendo puxado durante a instalação inicial aparecerá nessa lista e você precisará executar a inversão - depende desse pacote. Eventualmente, você verá o pacote inicial que deseja instalar nessa lista. Nesse ponto, você deve ter uma cadeia mostrando exatamente por que esse pacote foi instalado.

Como observação adicional, acredito que o recomendável está ativado por padrão, portanto, se algo estiver definido como recomendado, ele será puxado. Sugere se desativado, mas a dependência inversa também pode mostrar essas informações.

tgm4883
fonte
2
Embora eu tenha certeza de que essa resposta funcionaria, ela personifica o problema que o OP está tentando evitar. ubuntu-dev-toolsresulta na instalação dos seguintes pacotes. 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
Fake Name
2
[continuação] 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 (Nota: Os itens acima foram apenas os pacotes necessários sudo apt-get install ubuntu-dev-toolsem uma instância do servidor ubuntu bastante limpa). Se você está tentando evitar a instalação de grandes quantidades de lixo, essa provavelmente é a pior solução possível.
Fake Name