Como remover um deb sem remover suas dependências

35

Eu gostaria de instalar a versão mais recente do boto , que eu faço via python 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 eles o marcam como instalado externamente (ou algo assim) para que o apt não tente consertar a dependência ausente?

Obrigado,
Maxim.

    
por Maxim Veksler 16.12.2010 / 14:38

6 respostas

15

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

    
por João Pinto 16.12.2010 / 16:06
49

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

sudo dpkg -r --force-depends "package"
    
por user13364 31.03.2011 / 20:17
15

Eu sei que este é um post antigo, mas desde que 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 automaticamente atribuirá sinalizadores às dependências (auto) e quando você tentar remover o pacote novamente, ele tentará remover todas as dependências que ainda possuírem o sinalizador automático.

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

[email protected]:~$ 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, parece que

[email protected]:~$ aptitude search ^apache2
i A apache2        - Apache HTTP Server metapackage
<snip>

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

Então, para corrigir isso e não ter o apache, o mysql e o php desinstalados, podemos apenas remover o flag auto com o aptitude da seguinte forma:

[email protected]:~$ 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, é assim quando removemos o pacote do zabbix:

[email protected]:~$ 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, confira a página man do aptitude para mais detalhes

    
por David Berkan 07.01.2013 / 16:26
11

É exatamente para isso que o apt-mark hold é válido.

apt-mark hold package_name

Da documentação:

hold is used to mark a package as held back, which will prevent the package from being automatically installed, upgraded or removed. The command is only a wrapper around dpkg --set-selections and the state is therefore

Para desativar um pacote:

apt-mark unhold package_name

    
por Marcio 09.11.2015 / 17:07
3

AFAIK não há como remover um pacote usando o APT sem também remover os pacotes que dependem dele.

Referência: link

    
por aneeshep 16.12.2010 / 15:14
0

Para completar a resposta de João Pinto, você pode usar meu pequeno script para consertar o pacote quebrado, este script irá criar um pacote fictício com o equivs e instalá-lo. Você pode encontrar um artigo sobre meu blog em francês .

Ou diretamente no código principal .

Para usá-lo:

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