So entfernen Sie ein Deb, ohne seine Abhängigkeiten zu entfernen

43

Ich möchte die neueste Version von boto installieren , was ich über machepython setup.py install

Wenn ich jedoch versuche, die alte Version zu entfernen, werden auch die folgenden Pakete entfernt:

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

Wie kann ich den Paketmanager anweisen, boto zu entfernen und als extern installiert (oder so ähnlich) zu markieren, damit apt nicht versucht, die fehlende Abhängigkeit zu beheben?

Vielen Dank,
Maxim.

Maxim Veksler
quelle
Haben Sie versucht, <code> sudo dpkg --python-boto </ code> zu entfernen?
dkuntz2

Antworten:

16

Sie können mit dem equivsDienstprogramm ein Dummy-DEB-Paket erstellen , das die Abhängigkeit bereitstellt, ohne Dateien zu installieren. Dann ersetzen Sie einfach das aktuell installierte Paket durch die Dummy-Version dpkg -i fake.deb.

João Pinto
quelle
60

Verwende dpkg direkt, nicht apt-get oder aptitude:

sudo dpkg -r --force-depends "packagename-version"
Rogerdpack
quelle
1
Richtig, aber wenn ich versuche, mit apt etwas zu installieren, wird festgestellt, dass das mit dpkg entfernte Paket fehlt, und es wird erneut installiert. Die Frage, wie mache ich apt nicht, um es neu zu installieren / zu ignorieren, es ist Konsistenzstatus?
Maxim Veksler
15

Ich weiß, dass dies ein alter Beitrag ist, aber da ich kürzlich ein ähnliches Problem hatte, möchte ich meine Lösung in der Hoffnung mitteilen, dass es jemand in Zukunft nützlich findet.

Wenn Sie ein Paket über aptitude installiert haben, weist es den Abhängigkeiten automatisch Flags zu (auto), und wenn Sie versuchen, Ihr Paket erneut zu entfernen, versucht es, alle Abhängigkeiten zu entfernen, bei denen das Auto-Flag immer noch gesetzt ist.

Wie Sie in meinem Fall sehen können, ist es Zabbix, das ich entfernen möchte:

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

Und wenn wir das Apache-Paket nachschlagen, sieht es so aus

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

Das erste Flag "i" zeigt an, dass Apache installiert ist.
Das nächste Flag "A" steht für "automatisch installiert"

Um dies zu beheben und Apache, MySQL und PHP nicht deinstalliert zu haben, können wir einfach das Auto-Flag mit der folgenden Einstellung entfernen:

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.

Jetzt sieht es beim Entfernen des zabbix-Pakets so aus:

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

Bitte überprüfen Sie die Manpage für Eignung für weitere Details

David Berkan
quelle
Dies scheint die beste Antwort zu sein (je nach Situation). Es sollte nicht zu schwierig sein, einen Befehl zu erstellen, der alle abhängigen Personen findet und sie an unmarkauto weiterleitet.
Johny, warum
13

Genau dafür apt-mark holdist.

apt-mark hold package_name

Aus der Dokumentation:

hold wird verwendet, um ein Paket als zurückgehalten zu markieren, wodurch verhindert wird, dass das Paket automatisch installiert, aktualisiert oder entfernt wird. Der Befehl ist nur ein Wrapper um dpkg --set-selections und der Status ist daher

So heben Sie ein Paket auf:

apt-mark unhold package_name

Marcio
quelle
1
Für meine Situation ist dies der empfohlene Ansatz.
Paulo Coghi - Wiedereinsetzung von Monica am
1
Leider kann dies keine Abhängigkeiten enthalten. Dh wenn ich die Pakete A und B installiere und sie eine gemeinsame Abhängigkeit X haben, hält A nicht X und das Entfernen von B schlägt fehl mit "E: Fehler, pkgProblemResolver :: Generierte Brüche auflösen, kann dies durch angehaltene Pakete verursacht werden."
MSalters
Ich erhalte gerade eine Fehlermeldung, wenn ich versuche, dies zu tun: 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

Um die Antwort von João Pinto zu vervollständigen, können Sie mein kleines Skript verwenden, um defekte Pakete zu reparieren. Dieses Skript erstellt ein Dummy-Paket mit Äquivalenten und installiert es. Auf meinem Blog finden Sie einen Artikel in französischer Sprache .

Oder direkt am Hauptcode .

Um es zu benutzen:

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