¿Cómo consigo apt-get para ignorar algunas dependencias?

86

¿Cómo hago para que apt-get ignore algunas dependencias? Por ejemplo, quería instalar mailx para poder usarlo para enviar correos electrónicos desde scripts cron / herramientas de generación de informes. Sin embargo, la instalación de mailx también instala exim4 y un montón de dependencias (ya tengo instalado Postfix) que realmente no necesito y que supongo que mailx también puede vivir sin él.

¿Cómo ignoro algunas dependencias pero sigo usando apt-get ya que es una buena herramienta?

FrancisV
fuente
¿Cómo se instala Postfix? a través del paquete debian? o instalaste postfix desde la fuente?
estofado
Sí, Postfix se instaló desde el origen
FrancisV
3
El paquete mailx de Debian solo 'recomienda' exim4, no lo requiere. Si no desea instalar los paquetes recomendados, simplemente agréguelos APT::Install-Recommends "false";a su apt.conf.
Ruief
Encontré una respuesta satisfactoria a esto en unix.stackexchange.com; unix.stackexchange.com/a/404449/23542
artfulrobot

Respuestas:

45

Solución simple y fácil: simplemente especifique los paquetes no deseados con un extra -después de cada uno de ellos.

Ejemplo sin el -interruptor:

root@debian:~# apt-get install bsd-mailx 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  exim4-base exim4-config exim4-daemon-light liblockfile-bin liblockfile1
[...]

Ejemplo usando el interruptor para evitar la instalación exim4-base . Observe el -al final:

root@debian:~# apt-get install bsd-mailx exim4-base-
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package 'exim4-base' is not installed, so not removed
The following extra packages will be installed:
  liblockfile-bin liblockfile1 ssmtp
[...]

Como puede ver, apt-getya no intenta instalar el exim4-basepaquete y no intenta instalar sus diversas dependencias ( exim4-configetc.).

Y si te equivocaste y necesitabas esa exim4-basedependencia después de todo, ¡puedes apt-get installhacerlo más tarde!

Jealie
fuente
55
Esta es la mejor manera de evitar instalar una dependencia específica. Las otras respuestas evitan instalar todas las dependencias, desinstalar dependencias después de haberlas instalado o sugerir paquetes de edición tediosos.
Neil
1
¡Esto era exactamente lo que necesitaba! (instalación gnupg2sin pinentry-gtk2evitar X deps)
lapo
Sin embargo, eso es realmente genial, en mi caso apt-get se niega a instalar el paquete con "dependencias insatisfechas" (que especifiqué usando este método). Específicamente un paquete de documentación de 100 megabytes que no me interesa.
Rolf
3
Funciona solo con dependencias opcionales, no con las requeridas. Rmensaje error: Depends: xxx but it is not going to be installed. Puede omitir todos los paquetes opcionales conapt-get install --no-install-recommends PACKAGE
koppor
Tampoco funciona con paquetes virtuales. Pero vea unix.stackexchange.com/a/404449/23542
artfulrobot
55

Puede cambiar las dependencias de un paquete deb como este:

  1. Desempaquetar deb: ar x golden-linux.deb(creará, es decir, tres archivos: debian-binary control.tar.gz data.tar.gz)
  2. Descomprima el archivo de control: tar xzf control.tar.gz(creará: postinst postrm preinst prerm md5sums control)
  3. Arreglar dependencias en control(usar un editor de texto)
  4. Vuelva a embalar control.tar.gz: tar --ignore-failed-read -cvzf control.tar.gz {post,pre}{inst,rm} md5sums control
  5. Repack deb: ar rcs newpackage.deb debian-binary control.tar.gz data.tar.gz(¡orden importante! Ver [Nota])

[Nota]: ¡dpkg no podría leer los metadatos de un paquete rápidamente si tuviera que buscar dónde terminó la sección de datos!

Janus Troelsen
fuente
2
Agradable, me resuelve un caso especial de dependencias de "raring8" a "raring6" pero la misma versión = (, muchas gracias
Felipe Alcacibar
1
Gracias de mi parte también; Tuve que usar esto porque requería una aplicación libmng1.so.1a pesar de que funcionaba perfectamente con un enlace simbólico establecido en libmng1.so.2. apt-getsimplemente no podía ser amordazado y seguía molestándome acerca de las dependencias insatisfechas (¡incluso cuando instalo algo totalmente ajeno!). Qué carga de concepto de basura.
syntaxerror
+1 Esto funcionó perfectamente para mí también. Paquete gnome-settings-daemondeseado gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11pero ya tengo gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11.2(<- observe el ".2" al final). Este procedimiento me permitió editar el paquete y forzarlo a usar la versión más nueva de 11.2. ¡GRACIAS!
Eric Duncan
1
Gran solución, gracias. Modifiqué los pasos 2 y 4 un poco: 2. FILES=$(tar zxvf control.tar.gz)para almacenar la lista de archivos en una variable. 4. tar zcf control.tar.gz $FILES- cree el archivo en un solo paso sin canalizaciones o redireccionamientos utilizando la lista de archivos original (después de la modificación).
Brett
2
Otra pareja de sugerencias. Para el n. ° 4: agregue de --ignore-failed-readmodo que tarignore los archivos que faltan del resto de la línea de comandos. (Por ejemplo, prerm, postrmestán ausentes en muchos paquetes.) Además, las bolas de alquitrán pueden ser .xzmás que .gzen las últimas versiones del formato de archivo de Debian (por ejemplo data.tar.xz).
Dan Lenski el
33

Después de instalar el paquete con la --ignore-depends opción, vaya y edite el /var/lib/dpkg/statusarchivo, y elimine cualquier dependencia que crea que no es necesaria. Solo ten mucho cuidado. En fin un dep. que se requiere, es más que probable que SER requerido

Manolis
fuente
3
Después de la actualización /var/lib/dpkg/status, puede ser necesario finalizar la instalación con sudo apt-get -f install(no es necesario especificar un paquete).
Zmicier Zaleznicenka
También se encuentra aquí: superuser.com/a/815371/127024 .
Johann
Esto me da escalofríos, ¡pero funcionó a la perfección!
David Schmitt
25

Puedes probar la --nodepsbandera con apt-get.
O descargue el paquete e instálelo dpkgcon la opción --ignore-depends.

Por ejemplo, si desea instalar el paquete foosin dependencia bar:

dpkg --ignore-depends=bar -i foo_1.2.3_amd64.deb
Bart De Vos
fuente
52
¿Qué versión de APT tienes? La mía ( 0.8.10 ) no tiene esa opción.
tshepang
8
decirle a dpkg que ignore las exigencias no es una opción para él. Solo le dice a dpkg que ignore las dependencias para ESTA transacción, intentará satisfacer las dependencias o eliminará el paquete la próxima vez que haga algo.
estofado
2
Todavía no tuve suerte con APT 0.8.16 BTW. Lástima ya que no parece haber alternativas razonables. ¿Qué versión usaste en 2011 para que esto funcione?
Christian
2
puedes usar apt-get download y luego dpkg
Frederick Roth
77
--no-install-recommendstrabajó para mi.
Olle Härstedt
14

Como instaló postfix desde la fuente, debe instalar un paquete "ficticio" que satisfaga la dependencia del agente de transporte de correo de mailx (o bsd-mailx). El paquete "equivs" en debian existe para crear un paquete ficticio que puede instalar para decirle a dpkg "esta dependencia está satisfecha"

La razón por la que decirle a dpkg que simplemente ignore las dependencias no es una buena solución, es que solo le está diciendo a dpkg / apt que lo ignore para una sola transacción, no puede decirle que ignore las dependencias para siempre. Cada vez que usa apt, verifica las dependencias en todos los paquetes

estofado
fuente
2
Consulte también esta respuesta que enlaza con un tutorial (aunque es demasiado complejo) superuser.com/a/416560/128960 . La versión corta es: ejecutar equivs-control <name>, editar el archivo producido para proporcionar la dependencia correcta y tener un buen nombre, luego ejecutar equivs-build <name>y finalmente dpkg -iel archivo .deb resultante.
Christian
1
En mi humilde opinión, esta es realmente la mejor solución. Todas las demás soluciones solicitadas aquí son un poco hackeas. Esto solo debe hacerse una vez y luego puede instalar cualquier software dependiendo del software autocompilado ... ¡Así que votemos esta respuesta!
rugk
7

He estado buscando esta opción en un servidor Ubuntu 12.04 con Xen. En mis dominios utilizo el kernel virtual, y apt trató persistentemente de instalar grub con cada actualización del paquete del kernel. Sin embargo, Grub no es necesario dentro de domU cuando se usa p [yv] grub.

He estado buscando la opción -nodeps para apt-get también, pero no funcionó, así que terminé desinstalando / purgando grub * después de cada actualización del kernel.

Después de todo, leer realmente una página de manual ayuda a veces, parece que una opción similar de apt-get en 12.04 parece ser: no-install-recomendamos, lo que realmente funciona en este caso, ya que grub aparece como 'recomendado' en el información del paquete (supongo que no es una dependencia "real").

Estoy agregando esto aquí porque en mi caso resolvió un problema similar, y la sugerencia para '--no-install-recomendamos' aún no se mencionó.

memartin
fuente
6

Puede descargar el paquete con apt-get y luego instalarlo con dpkg, enumerando manualmente la dependencia que desea ignorar.

Por ejemplo, si quiero descargar mypackage pero depende de libperl5.14 y no quiero instalar libperl5.14 ya que tengo una versión diferente, puedo ignorar esta dependencia de la siguiente manera:

apt-get download mypackage
dpkg -i --ignore-depends=libperl5.14 mypackage.deb
A.Badger
fuente
Solo por mencionar que esto te dejará apto "roto". No le permitirá instalar otros paquetes hasta que arregle la dependencia que falta.
drpexe
6

Una forma alternativa de ajustar manualmente las dependencias es:

apt-get download yourpackage
dpkg-deb -x yourpackage.deb PackageFolder
dpkg-deb --control yourpackage.deb PackageFolder/DEBIAN
vim PackageFolder/DEBIAN/control
dpkg -b PackageFolder yourpackage2.deb
apt-get install ./yourpackage2.deb
AndrewHarvey
fuente
2

En mi sistema Debian, bsd-mailx realmente depende default-mta | mail-transport-agent(puede verificar de qué depende un paquete apt-cache show <pkg>para cualquier cosa en el archivo o dpkg -s <pkg>para los paquetes instalados.

Puede ser que su paquete postfix no tenga, Provides: mail-transport-agentpor lo que apt no se da cuenta de que tiene un MTA instalado. Valdría la pena presentar un error si es un paquete oficial.

Andy
fuente
1

A los efectos de esto, ¿podría instalar clavo que no creo que tenga estas dependencias?

apt-get install nail
jamespo
fuente
-5

Bueno, no lo hagas.

Usar el trabajo de otras personas es muy importante en el camino hacia cualquier éxito. Cuando construyes algún software desde la fuente (tarball), pierdes la oportunidad de usar el trabajo del administrador de paquetes de la distribución.

No recibirá actualizaciones "gratuitas". La mayoría de las veces, ninguno actualiza los paquetes que instalaron desde la fuente. Debido a que necesitan rastrear el software para nuevas versiones, reconstruirlo y todos los programas dependientes (trate de recordarlos).

Tendrá problemas con otros paquetes de los repositorios de su distribución. Este es exactamente el caso indicado en la pregunta: ubuntu tiene un excelente administrador de paquetes y algunas personas muy agradables que mantienen los paquetes. Y han decidido que para que el programa mailx funcione se necesita un MTA. Entonces, si instaló postfix desde las fuentes, ubuntu no le pediría que instale exim.

Si por alguna razón el mantenimiento del servidor pasa a otra persona (por ejemplo, su proyecto se vuelve muy exitoso y decide contratar a otro tipo para que administre los servidores mientras está ocupado con otras cosas), naturalmente esperará correr dpkg --get-selectionspara obtener todo el paquetes instalados

Intente utilizar el software de administración de paquetes de la distribución tanto como sea posible. Aprenda a crear sus propios paquetes si no puede encontrar uno preconstruido y se convertirá en un mejor profesional.

skarap
fuente