Como instalar apenas as dependências de um pacote?

45

A execução sudo apt-get install <PACKAGE>instalará o pacote, suas dependências e outros pacotes recomendados.

No entanto, não parece haver uma maneira de instalar apenas as dependências de um pacote e excluir o próprio pacote.

Como alguém faria isso?

Nathan Osman
fonte
Apenas curioso, por que você quer fazer isso?
Kris Harper #
@ root45: Bem, é um pouco de uma situação única: eu tenho o código-fonte para um pacote Python nos repositórios. e não está começando. Preciso instalar as dependências do pacote sem instalar o próprio pacote (já que eu já tenho o código).
Nathan Osman
1
Você não poderia simplesmente fazer uma instalação a seco do apt-get e ver o que será instalado? Em seguida, basta instalar tudo, menos o aplicativo que você está compilando?
Duffydack 1/11
2
Ou apenas instale-o e remova o aplicativo (mas não suas dependências). E / ou instale um pacote atualizado / fixo depois de construí-lo.
janc
Eu preciso da capacidade de fazer isso para poder construir e instalar um pacote de origem que ainda não foi criado para minha arquitetura. apt-get build-depinstala dependências de compilação, apt-get -b sourcefunciona, mas dependências de tempo de execução não estão instaladas, portanto dpkg -i *.debfalha.
Trevor Robinson

Respostas:

24

Isso instalará todos os pacotes no campo Depende e PréDepends do pacote :

sudo apt-get install $(apt-cache depends <PACKAGE> | grep Depends | sed "s/.*ends:\ //" | tr '\n' ' ')

Basicamente, você solicita todas as dependências, filtra os (Pré) Depends e formata essa saída para o apt-get.

Um problema são dependências como

Depends: pulseaudio
  pulseaudio:i386

ou pacotes virtuais como

Depends: <java6-runtime-headless>
  default-jre-headless
  openjdk-6-jre-headless

Portanto: use com cuidado - ele não funciona em todos os casos!

htorque
fonte
1
Existem muitos casos em que isso não é possível, por exemplo, ele ocorre completamente em pacotes virtuais (que são impressos entre colchetes). Veja aqui exemplos: askubuntu.com/questions/25361/…
Trevor Robinson
Obrigado pela dica, embora não tenha muita certeza de como lidam com todos esses problemas. :-(
htorque 26/01/12
2
Se me permite, gostaria de sugerir uma solução mais simples com o AWK: #sudo apt-get install $(apt-cache depends PACKAGE-NAME-HERE | awk '$1~/Depends/{printf $2" "}')
Sergiy Kolodyazhnyy
1
Encontrei o problema do pacote virtual mencionado acima; atualização sedna calha para o seguinte trabalhou para mim: sed -e "s/.*ends:\ //" -e 's/<[^>]*>//'. No meu caso, o pacote virtual < >foi precedido pelo pacote que o satisfazia, portanto, a remoção do item < >funcionou bem.
berto
5

apt-get build-dep <package> fará o truque.

Laudeci
fonte
13
Isso não funcionará porque o pacote possui dependências de tempo de execução que não serão instaladas apt-get build-dep.
19412 Nathan Osman
5

Se você não se importa de copiar / colar, apenas simule uma instalação do apt-get com -s. Dessa forma, você verá quais outros pacotes serão instalados e / ou atualizados e, em seguida, basta remover o nome do pacote que não deseja instalar dessa lista e pronto.

sudo apt-get install -s <package>

domingo
fonte
4

Para listar todas as dependências de um determinado pacote que não está sendo instalado, você pode usar aptitude

aptitude search '!~i?reverse-depends("^PACKAGE_NAME$")'

Para instalar as dependências

aptitude search '!~i?reverse-depends("^PACKAGE_NAME$")' -F "%p" | xargs sudo apt-get install

Exemplos

  • Listar as dependências

    % aptitude search '!~i?reverse-depends("^mc$")'
    p    mc-data         - Midnight Commander - a powerful file manager -- data files
    
  • Mostrar apenas o nome do pacote

    % aptitude search '!~i?reverse-depends("^mc$")' -F "%p"
    mc-data                            
    
  • Instale as dependências para, por exemplo mc

    % aptitude search '!~i?reverse-depends("^mc$")' -F "%p" | xargs sudo apt-get install     
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following NEW packages will be installed:
      mc-data
    0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
    Need to get 1.166 kB of archives.
    After this operation, 5.550 kB of additional disk space will be used.
    Get:1 http://archive.ubuntu.com/ubuntu/ wily/universe mc-data all 3:4.8.13-3 [1.166 kB]
    Fetched 1.166 kB in 0s (1.250 kB/s)
    Selecting previously unselected package mc-data.
    (Reading database ... 606748 files and directories currently installed.)
    Preparing to unpack .../mc-data_3%3a4.8.13-3_all.deb ...
    Unpacking mc-data (3:4.8.13-3) ...
    Processing triggers for doc-base (0.10.6) ...
    Processing 1 added doc-base file...
    Registering documents with scrollkeeper...
    Processing triggers for man-db (2.7.4-1) ...
    Processing triggers for hicolor-icon-theme (0.15-0ubuntu1) ...
    Setting up mc-data (3:4.8.13-3) ...
    
AB
fonte
1

Você pode analisar a saída de uma simulação de instalação apt para fazer isso, aqui está uma função bash para fazer isso por você:

apt-install-depends() {
    local pkg="$1"
    apt-get install -s "$pkg" \
      | sed -n \
        -e "/^Inst $pkg /d" \
        -e 's/^Inst \([^ ]\+\) .*$/\1/p' \
      | xargs apt-get install
}

Uso:

apt-install-depends mopidy
trevorjay
fonte
0

Para instalar apenas dependências, você pode usar apt-cache show package | grep Depends. Isso fornecerá uma lista de dependências:

apt-cache show apache2 | grep Depends
Depends: apache2-mpm-worker (= 2.2.22-6ubuntu5.1) | apache2-mpm-prefork (= 2.2.22-6ubuntu5.1) | apache2-mpm-event (= 2.2.22-6ubuntu5.1) | apache2-mpm-itk (= 2.2.22-6ubuntu5.1), apache2.2-common (= 2.2.22-6ubuntu5.1)

então você pode decidir qual pacote instalar com o apt-get. Há também aptitudeno modo interativo, você procura o pacote, seleciona-o e depois instala suas dependências:

insira a descrição da imagem aqui

Braiam
fonte