Comment supprimer un deb sans enlever ses dépendances

43

J'aimerais installer la version la plus récente de boto , que je fais viapython setup.py install

Pourtant, lorsque j'essaie de supprimer l'ancienne version, les packages suivants sont également supprimés:

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

Comment puis-je dire au gestionnaire de paquets de supprimer boto, et de le marquer comme installé en externe (ou quelque chose comme ça) afin qu'apt ne tente pas de réparer la dépendance manquante?

Merci
Maxim.

Maxim Veksler
la source
Avez-vous essayé <code> sudo dpkg - supprimer python-boto </ code>?
dkuntz2

Réponses:

16

Vous pouvez créer un package .deb factice à l'aide de l' equivsutilitaire, il fournira la dépendance sans installer aucun fichier. Ensuite, remplacez simplement le package actuellement installé par la version factice dpkg -i fake.deb.

João Pinto
la source
60

Utilisez directement dpkg, pas apt-get ou aptitude:

sudo dpkg -r --force-depends "packagename-version"
rogerdpack
la source
1
Bien, mais lorsque j'essaierai d'utiliser apt pour installer quelque chose, il détectera que le paquet que j'ai supprimé avec dpkg est manquant et le réinstallera. La question de savoir comment faire pour ne pas vouloir le réinstaller / ignorer son état de cohérence?
Maxim Veksler
15

Je sais que ceci est un ancien message, mais depuis que j’ai eu récemment un problème similaire, je voudrais partager ma solution dans l’espoir que, à l’avenir, une personne le trouve utile.

Si vous avez installé un paquet via aptitude, il attribue automatiquement des indicateurs aux dépendances (auto) et lorsque vous essayez de supprimer votre paquet à nouveau, il essaie de supprimer toutes ses dépendances pour lesquelles l'indicateur automatique est toujours défini.

Comme vous pouvez le voir dans mon cas, c’est zabbix que je veux supprimer:

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/?]

Et si nous regardons le paquetage apache, cela ressemble à ceci

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

le premier drapeau "i" nous indique qu'apache est installé
Le prochain drapeau "A" signifie automatiquement installé

Donc, afin de résoudre ce problème sans avoir désinstallé apache, mysql et php, nous pouvons simplement supprimer le drapeau automatique avec aptitude comme ceci:

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.

Cela ressemble maintenant à ceci lors de la suppression du paquet 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/?] 

Veuillez consulter la page de manuel d'aptitude pour plus de détails.

David Berkan
la source
Cela semble être la meilleure des réponses (selon la situation). Ne devrait pas être trop difficile de faire une commande qui trouve toutes les personnes à charge et les dirige vers unmarkauto.
johny pourquoi
13

C'est exactement ce que apt-mark holdc'est.

apt-mark hold package_name

De la documentation:

hold est utilisé pour marquer un paquet comme étant retenu, ce qui empêchera son installation, sa mise à niveau ou sa suppression automatique. La commande est seulement un wrapper autour de dpkg --set-selections et l’état est donc

Pour retirer un colis:

apt-mark unhold package_name

Marcio
la source
1
Pour ma situation, c'est l'approche recommandée.
Paulo Coghi - Réintégrer Monica le
1
Malheureusement, cela ne tient pas aux dépendances. En d'autres termes, si j'installe les packages A et B et qu'ils partagent une dépendance commune X, conserver A ne conservera pas X et la suppression de B échouera avec "E: Erreur, pkgProblemResolver :: Résoudre les ruptures générées, ce qui pourrait être causé par des packages bloqués".
MSalters
Je viens de recevoir une erreur en essayant de faire ceci: 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

Pour compléter la réponse de João Pinto, vous pouvez utiliser mon petit script pour réparer un paquet endommagé. Ce script créera un paquet factice avec des équivalents et l'installera. Vous pouvez trouver un article sur mon blog en français .

Ou directement sur le code général .

Pour l'utiliser:

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