¿Cómo instalar solo las dependencias de un paquete?

45

La ejecución sudo apt-get install <PACKAGE>instalará el paquete, sus dependencias y cualquier otro paquete recomendado.

Sin embargo, no parece haber una manera de instalar solo las dependencias de un paquete y excluir el paquete en sí.

¿Cómo se podría hacer esto?

Nathan Osman
fuente
Por curiosidad, ¿por qué quieres hacer esto?
Kris Harper
@ root45: Bueno, es una situación un poco única: tengo el código fuente de un paquete de Python en los repositorios. Y no está empezando. Necesito instalar las dependencias para el paquete sin instalar el paquete en sí (ya que tengo el código).
Nathan Osman el
1
¿No podría simplemente hacer una instalación en seco de apt-get install y ver qué se va a instalar, luego simplemente instalar todo menos la aplicación que está compilando?
duffydack 01 de
2
O simplemente instálelo y luego elimine la aplicación (pero no sus dependencias). Y / o instale un paquete actualizado / fijo después de compilarlo.
JanC
Necesito la capacidad de hacer esto para poder construir e instalar un paquete fuente que aún no está construido para mi arquitectura. apt-get build-depinstala dependencias de compilación, por lo que apt-get -b sourcefunciona, pero las dependencias de tiempo de ejecución no están instaladas, por lo que dpkg -i *.debfalla.
Trevor Robinson

Respuestas:

24

Esto instalará todos los paquetes en el campo Depende y Predepende del paquete :

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

Básicamente, solicita todas las dependencias, filtra las (Pre) Depende y formatea esa salida para apt-get.

Un problema son las dependencias como

Depends: pulseaudio
  pulseaudio:i386

o paquetes virtuales como

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

Por lo tanto: úselo con cuidado, ¡no funciona en todos los casos!

htorque
fuente
1
Hay muchos casos que esto no maneja, por ejemplo, se romperá por completo en paquetes virtuales (que están impresos entre paréntesis angulares). Vea aquí ejemplos: askubuntu.com/questions/25361/…
Trevor Robinson
Gracias por la pista, aunque no estoy realmente seguro de cómo manejar todos esos problemas. :-(
htorque
2
Si puedo, me gustaría sugerir una solución más simple con AWK:sudo apt-get install $(apt-cache depends PACKAGE-NAME-HERE | awk '$1~/Depends/{printf $2" "}')
Sergiy Kolodyazhnyy
1
Me encontré con el problema del paquete virtual que mencionas anteriormente; actualización seden la tubería a la siguiente trabajó para mí: sed -e "s/.*ends:\ //" -e 's/<[^>]*>//'. En mi caso, el paquete virtual < >fue precedido por el paquete que lo satisface, por lo que eliminar el elemento < >funcionó bien.
berto
5

apt-get build-dep <package> Hará el truco.

Laudeci
fuente
13
Eso no funcionará porque el paquete tiene dependencias de tiempo de ejecución que no se instalarán con apt-get build-dep.
Nathan Osman
5

Si no te importa copiar / pasado, simplemente simular un apt-get install con -s. De esa manera verá qué otros paquetes se instalarán y / o actualizarán, luego simplemente elimine el nombre del paquete que no desea instalar de esa lista y listo.

sudo apt-get install -s <package>

bksunday
fuente
4

Para enumerar todas las dependencias de un paquete dado que no se está instalando, puede usar aptitude

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

Para instalar las dependencias

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

Ejemplos

  • Enumerar las dependencias.

    % aptitude search '!~i?reverse-depends("^mc$")'
    p    mc-data         - Midnight Commander - a powerful file manager -- data files
    
  • Mostrar solo el nombre del paquete

    % aptitude search '!~i?reverse-depends("^mc$")' -F "%p"
    mc-data                            
    
  • Instale las dependencias para, p. Ej. 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
fuente
1

Puede analizar la salida de una simulación de instalación apta para hacer esto, aquí hay una función bash para que lo haga por usted:

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
fuente
0

Para instalar solo dependencias, puede usar apt-cache show package | grep Depends. Esto le dará una lista de dependencias:

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)

entonces puede decidir qué paquete instalar con apt-get. También está aptitudeen el modo interactivo, busca el paquete, selecciónalo y luego instala sus dependencias:

ingrese la descripción de la imagen aquí

Braiam
fuente