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

13

Esta pergunta é semelhante a Como posso encontrar Por que um pacote foi instalado? , mas no meu caso eu gostaria de saber antes realmente instalar um pacote, porque ele irá instalar uma dependência em particular.

Então, por exemplo, eu posso correr

sudo apt-get install superfoo

e a saída vai dizer algo como:

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

E isso pode ser uma lista realmente enorme. Em alguns casos, vou ver algo que vai ser instalado que realmente não faz sentido para mim, dado o que estou instalando, então eu quero saber por que essa dependência em particular será instalado.

No exemplo acima, digamos que eu gostaria de entender por que libderp seria instalado. Eu sei que de alguma forma existe uma cadeia de dependências entre superfoo e libderp , mas a enorme lista de pacotes a serem instalados dificulta ver o que esta cadeia é.

Uma vez que conheço a cadeia de dependências, posso decidir se quero realmente instalar o pacote original ou não, e / ou se devo entrar em contato com o mantenedor desse pacote para ver se eles realmente precisa ter essas dependências lá.

    
por pbouf77 06.05.2012 / 23:31

3 respostas

11

O que você realmente parece estar perguntando é "Como diagramamento de dependências?" assim você pode ver quais pacotes puxam quais dependências.

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

Aqui está um exemplo de apt-cache para listar dependências do pacote 'hello' em formato de texto. A saída de texto será sempre 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 arquivo de ponto, como dotty (incluído no pacote graphviz, também parte da instalação padrão)

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

$ apt-cache dotty hello > dotfile
$ dotty dotfile

Olhando por cima, você pode ver que o pacote 'hello' puxa uma tonelada de pacotes Perl ... e qual dependência faz isso.

    
por user535733 07.05.2012 / 01:17
7

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

apt-get install ubuntu-dev-tools

Ou clicando neste botão:

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

reverse-depends libsmpeg0

Qual seria o resultado?

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. Se não, então outro dos pacotes que estão sendo puxados durante a instalação inicial aparecerá nessa lista, e você precisará executar a reversão - depende desse pacote. Eventualmente, você verá o pacote inicial que você deseja instalar nessa lista. Nesse ponto, você deve ter uma cadeia mostrando exatamente por que esse pacote foi instalado.

Como nota adicionada, acredito que a recomendação esteja ativada por padrão, portanto, se algo estiver definido como uma recomendação, ela será enviada para. Sugere se desativado, mas depende de inversão também pode mostrar essa informação.

    
por tgm4883 06.05.2012 / 23:43
6

apt-rdepends faz isso, sem instalando mais de 50 bibliotecas de arquivos como 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-rdepends exigiu apenas libapt-pkg-perl para instalação. É muito mais claro que ubuntu-dev-tools , e ainda é recursivo, então você obtém all as dependências, em vez de apenas as dependências de primeira ordem, como apt-cache depends retorna.

    
por Fake Name 15.04.2014 / 09:47