Cómo eliminar un deb sin eliminar sus dependencias

43

Me gustaría instalar la versión más reciente de boto , que hago a través depython setup.py install

Sin embargo, cuando intento eliminar la versión anterior, también se eliminan los siguientes paquetes:

apt-get remove python-boto
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  cloud-init cloud-utils euca2ools python-boto

¿Cómo puedo decirle al administrador de paquetes que elimine el boto y que lo marquen como instalado externamente (o algo así) para que apt no intente solucionar la dependencia que falta?

Gracias
Maxim.

Maxim Veksler
fuente
¿Has probado <code> sudo dpkg --remove python-boto </code>?
dkuntz2

Respuestas:

16

Puede crear un paquete .deb ficticio utilizando la equivsutilidad, proporcionará la dependencia sin instalar ningún archivo. Luego simplemente reemplace el paquete actualmente instalado a la versión ficticia usando dpkg -i fake.deb.

João Pinto
fuente
60

Use dpkg directamente, no apt-get o aptitude:

sudo dpkg -r --force-depends "packagename-version"
rogerdpack
fuente
1
Correcto, pero cuando intente usar apt para instalar algo, detectará que falta el paquete que eliminé con dpkg y lo reinstalará. La pregunta ¿cómo hago para no querer reinstalarlo / ignorar su estado de consistencia?
Maxim Veksler
15

Sé que esta es una publicación antigua, pero como recientemente tuve un problema similar, me gustaría compartir mi solución con la esperanza de que alguien en el futuro la encuentre útil.

Si instaló un paquete a través de aptitude, automáticamente asigna indicadores a las dependencias (automático) y cuando intenta eliminar su paquete nuevamente, intenta eliminar todas sus dependencias que todavía tienen establecido el indicador automático.

Como puede ver en mi caso, es zabbix lo que quiero eliminar:

uman@mango:~$ sudo aptitude purge zabbix-server-mysql zabbix-frontend-php
The following packages will be REMOVED:  
  apache2{u} dbconfig-common{u} fping{u} javascript-common{u} libhtml-template-perl{u} libiksemel3{u} libjs-prototype{u} 
  libjs-scriptaculous{u} libopenipmi0{u} libt1-5{u} mysql-server{u} mysql-server-5.1{u} mysql-server-core-5.1{u} php5{u} php5-gd{u} 
  php5-mysql{u} snmpd{u} wwwconfig-common{u} zabbix-frontend-php{p} zabbix-server-mysql{p} 
0 packages upgraded, 0 newly installed, 20 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 44.9 MB will be freed.
Do you want to continue? [Y/n/?]

Y si buscamos el paquete de Apache se ve así

uman@mango:~$ aptitude search ^apache2
i A apache2        - Apache HTTP Server metapackage
<snip>

la primera bandera "i" nos dice que apache está instalado
La siguiente bandera "A" significa instalación automática

Entonces, para solucionar esto y no tener desinstalados apache, mysql y php, podemos eliminar el indicador automático con una aptitud como esta:

uman@mango:~$ sudo aptitude unmarkauto apache2 mysql-server php5
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.

Ahora se ve así cuando se elimina el paquete zabbix:

uman@mango:~$ sudo aptitude purge zabbix-server-mysql zabbix-frontend-php
The following packages will be REMOVED:  
  dbconfig-common{u} fping{u} javascript-common{u} libiksemel3{u} libjs-prototype{u} libjs-scriptaculous{u} libopenipmi0{u} libt1-5{u} 
  php5-gd{u} wwwconfig-common{u} zabbix-frontend-php{p} zabbix-server-mysql{p} 
0 packages upgraded, 0 newly installed, 12 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 16.6 MB will be freed.
Do you want to continue? [Y/n/?] 

Por favor, consulte la página del manual de aptitud para obtener más detalles

David Berkan
fuente
Esta parece ser la mejor respuesta de todas (dependiendo de la situación). No debería ser demasiado difícil hacer un comando que encuentre a todos los dependientes y los canalice a unmarkauto.
johny por qué el
13

Eso es exactamente para lo que apt-mark holdsirve.

apt-mark hold package_name

De la documentación:

hold se usa para marcar un paquete como retenido, lo que evitará que el paquete se instale, actualice o elimine automáticamente. El comando es solo un contenedor alrededor de dpkg --set-selections y, por lo tanto, el estado es

Para deshacer un paquete:

apt-mark unhold package_name

Marcio
fuente
1
Para mi situación, este es el enfoque recomendado.
Paulo Coghi - Restablece a Mónica el
1
Desafortunadamente, esto no puede mantener las dependencias. Es decir, si instalo los paquetes A y B y comparten una dependencia común X, mantener A no mantendrá X y eliminar B fallará con "E: Error, pkgProblemResolver :: Resolver interrupciones generadas, esto puede ser causado por paquetes retenidos".
MSalters
Solo recibo un error al intentar hacer esto: The following packages have unmet dependencies: mysql-server-5.7 : Depends: apparmor (>= 2.10) but it is not going to be installed E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.
frogstarr78
0

Para completar la respuesta de João Pinto, puede usar mi pequeño script para arreglar el paquete roto, este script creará un paquete ficticio con equivs y lo instalará. Puedes encontrar un artículo en mi blog en francés .

O directamente en el código esencial .

Para usarlo:

$ ./gen-dummy-package.sh --install|i [packageName]+
# e.g. :
$ ./gen-dummy-package.sh -i rfkill nome-bluetooth bluez
heralight
fuente