Jak usunąć deb bez usuwania jego zależności

43

Chciałbym zainstalować najnowszą wersję boto , którą wykonuję za pośrednictwempython setup.py install

Jednak gdy próbuję usunąć starą wersję, następujące pakiety również zostają usunięte:

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

Jak mogę powiedzieć menedżerowi pakietów, aby usunął boto, i oznaczy go jako zainstalowany zewnętrznie (lub coś w tym rodzaju), aby apt nie próbował naprawić brakującej zależności?

Dziękuję
Maxim.

Maxim Veksler
źródło
Czy próbowałeś <code> sudo dpkg --remove python-boto </code>?
dkuntz2,

Odpowiedzi:

16

Za pomocą tego equivsnarzędzia można utworzyć fikcyjny pakiet .deb , który zapewni zależność bez instalowania żadnych plików. Następnie po prostu zamień aktualnie zainstalowany pakiet na wersję fikcyjną za pomocą dpkg -i fake.deb.

João Pinto
źródło
60

Używaj dpkg bezpośrednio, nie apt-get ani aptitude:

sudo dpkg -r --force-depends "packagename-version"
rogerdpack
źródło
1
Tak, ale kiedy spróbuję użyć programu apt do zainstalowania czegoś, wykryje, że brakuje pakietu, który usunąłem za pomocą dpkg, i ponownie go zainstaluję. Pytanie, jak sprawić, by apt nie chciał go ponownie instalować / ignorować stanu spójności?
Maxim Veksler,
15

Wiem, że to stary post, ale ponieważ ostatnio miałem podobny problem, chciałbym podzielić się moim rozwiązaniem w nadziei, że ktoś w przyszłości uzna to za przydatne.

Jeśli zainstalowałeś pakiet za pomocą aptitude, automatycznie przypisuje flagi do zależności (auto), a kiedy próbujesz usunąć pakiet ponownie, próbuje usunąć wszystkie jego zależności, które mają wciąż ustawioną flagę auto.

Jak widać w moim przypadku, to zabbix, który chcę usunąć:

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

A jeśli spojrzymy na pakiet apache, wygląda to tak

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

pierwsza flaga „i” mówi nam, że apache jest zainstalowany
Następna flaga „A” oznacza automatycznie zainstalowaną

Aby to naprawić i nie mając odinstalowanego apache, mysql i php, możemy po prostu usunąć flagę auto z następującymi umiejętnościami:

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.

Teraz wygląda to tak podczas usuwania pakietu 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/?] 

Zajrzyj na stronę podręcznika man, aby uzyskać więcej informacji

David Berkan
źródło
To wydaje się najlepszą odpowiedzią ze wszystkich (w zależności od sytuacji). Nie powinno być zbyt trudne wykonanie polecenia, które znajdzie wszystkie osoby na utrzymaniu i doprowadzi ich do unmarkauto.
John, dlaczego
13

Właśnie po to apt-mark holdjest.

apt-mark hold package_name

Z dokumentacji:

Hold służy do oznaczania pakietu jako wstrzymanego, co uniemożliwi automatyczne zainstalowanie, uaktualnienie lub usunięcie pakietu. Polecenie to jest tylko opakowaniem wokół dpkg --set-selections i dlatego stan jest taki

Aby zatrzymać pakiet:

apt-mark unhold package_name

Marcio
źródło
1
W mojej sytuacji jest to zalecane podejście.
Paulo Coghi,
1
Niestety nie zachowuje to zależności. To znaczy, jeśli zainstaluję pakiety A i B i mają one wspólną zależność X, przytrzymanie A nie będzie zawierać X, a usunięcie B zakończy się niepowodzeniem z „E: Błąd, pkgProblemResolver :: Rozwiąż wygenerowane przerwy, może to być spowodowane wstrzymanymi pakietami”.
MSalters
Podczas próby zrobienia tego 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.
pojawia
0

Aby uzupełnić odpowiedź João Pinto, możesz użyć mojego małego skryptu, aby naprawić uszkodzony pakiet, ten skrypt utworzy atrapę pakietu z ekwiwalentami i zainstaluje go. Artykuł na moim blogu możesz znaleźć w języku francuskim .

Lub bezpośrednio w kodzie gist .

Aby go użyć:

$ ./gen-dummy-package.sh --install|i [packageName]+
# e.g. :
$ ./gen-dummy-package.sh -i rfkill nome-bluetooth bluez
heralight
źródło