Como remover um deb sem remover suas dependências

43

Gostaria de instalar a versão mais recente do boto , que eu faço viapython setup.py install

No entanto, quando tento remover a versão antiga, os seguintes pacotes também são removidos:

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

Como posso dizer ao gerenciador de pacotes para remover o boto e marcá-lo como instalado externamente (ou algo assim) para que o apt não tente consertar a dependência que está faltando?

Obrigado,
Maxim.

Maxim Veksler
fonte
Você já tentou o <code> sudo dpkg --remove python-boto </code>?
dkuntz2

Respostas:

16

Você pode criar um pacote .deb fictício usando o equivsutilitário, ele fornecerá a dependência sem instalar nenhum arquivo. Em seguida, substitua o pacote atualmente instalado pela versão fictícia usando dpkg -i fake.deb.

João Pinto
fonte
60

Use o dpkg diretamente, não o apt-get ou o aptitude:

sudo dpkg -r --force-depends "packagename-version"
rogerdpack
fonte
1
Certo, mas quando tentarei usar o apt para instalar algo, ele detectará que o pacote que removi com o dpkg está ausente e o reinstalará. A pergunta como eu faço para o apt não querer reinstalá-lo / ignorar seu estado de consistência?
precisa saber é o seguinte
15

Sei que este é um post antigo, mas, como recentemente tive um problema semelhante, gostaria de compartilhar minha solução na esperança de que alguém no futuro ache útil.

Se você instalou um pacote via aptitude, ele atribui automaticamente sinalizadores às dependências (auto) e quando você tenta remover seu pacote novamente, ele tenta remover todas as dependências que ainda possuem o sinalizador automático definido.

Como você pode ver no meu caso, é o zabbix que eu quero remover:

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

E se procurarmos o pacote apache, fica assim

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

o primeiro sinalizador "i" nos diz que o apache está instalado
O próximo sinalizador "A" significa instalado automaticamente

Portanto, para corrigir isso e não ter o apache, o mysql e o php desinstalados, podemos apenas remover a flag automática com o aptitude como este:

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.

Agora fica assim ao remover o pacote 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/?] 

Verifique a página de manual do aptitude para obter mais detalhes

David Berkan
fonte
Esta parece ser a melhor resposta de todas (dependendo da situação). Não deve ser muito difícil executar um comando que encontre todos os dependentes e os canalize para unmarkauto.
johny why
13

É exatamente apt-mark holdpara isso.

apt-mark hold package_name

A partir da documentação:

hold é usado para marcar um pacote como retido, o que impedirá que o pacote seja instalado, atualizado ou removido automaticamente. O comando é apenas um wrapper em torno do dpkg --set-selections e o estado é, portanto,

Para retirar um pacote:

apt-mark unhold package_name

Marcio
fonte
1
Para minha situação, essa é a abordagem recomendada.
Paulo Coghi - Restabelece Monica
1
Infelizmente, isso falha em manter dependências. Ou seja, se eu instalar os pacotes A e B e eles compartilharem uma dependência comum X, manter A não conterá X e remover B falhará com "E: Erro, pkgProblemResolver :: Resolver quebras geradas, isso pode ser causado por pacotes retidos."
MSalters 26/10/17
Acabei de receber um erro ao tentar fazer isso: 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 a resposta de João Pinto, você pode usar meu pequeno script para corrigir um pacote quebrado, este script criará um pacote fictício com equivs e o instalará. Você pode encontrar um artigo no meu blog em francês .

Ou diretamente no código da essência .

Para usá-lo:

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