如何在不删除依赖的情况下删除deb


43

我想安装boto的最新版本,我通过python setup.py install

但是,当我尝试删除旧版本时,也会删除以下软件包:

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

我如何告诉软件包管理器删除boto,并将它们标记为外部安装(或类似的东西),以便apt不会尝试修复缺少的依赖项?

谢谢你,
马克西姆。


您是否尝试过<code> sudo dpkg-删除python-boto </ code>?
dkuntz2

Answers:


16

您可以使用该equivs实用程序创建一个虚拟.deb程序包,它将提供依赖性,而无需安装任何文件。然后只需使用将当前安装的软件包替换为虚拟版本即可dpkg -i fake.deb


60

直接使用dpkg,而不是apt-get或aptitude:

sudo dpkg -r --force-depends "packagename-version"

1
是的,但是当我尝试使用apt安装某些东西时,它将检测到我用dpkg删除的软件包丢失了,将重新安装它。我该如何避免重新安装/忽略其一致性状态?
Maxim Veksler 2011年

15

我知道这是一篇过时的文章,但是由于我最近遇到了类似的问题,所以我希望分享自己的解决方案,以希望将来有人发现它有用。

如果通过aptitude安装了软件包,它将自动为依赖项分配标志(自动),当您再次尝试删除软件包时,它将尝试删除所有仍设置了auto标志的依赖项。

如您所见,我要删除的是zabbix:

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

如果我们查找apache包,它看起来像这样

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

第一个标志“ i”告诉我们已安装apache
,下一个标志“ A”代表自动安装

因此,为了解决此问题而不卸载apache,mysql和php,我们可以使用aptitude删除auto标志,如下所示:

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.

现在,在删除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/?] 

请查看手册页以了解更多详细信息


这似乎是所有问题的最佳答案(取决于情况)。创建一个查找所有依赖项并将其通过管道传递给unmarkauto的命令应该不太难。
约翰尼,为什么

13

那正是apt-mark hold目的。

apt-mark hold package_name

从文档中:

hold用于将软件包标记为已保留,这将阻止软件包被自动安装,升级或删除。该命令只是dpkg --set-selections的包装,因此状态为

要取消打包:

apt-mark unhold package_name


1
对于我的情况,这是推荐的方法。
Paulo Coghi,2016年

1
不幸的是,这不能保持依赖关系。即,如果我安装了软件包A和B,并且它们共享一个共同的依赖项X,则持有A不会持有X,并且删除B将会失败,并显示“ E:错误,pkgProblemResolver :: Resolve生成的中断,这可能是由持有的软件包引起的。”
MSalters

尝试执行此操作时,我只是收到一个错误: 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

要完成JoãoPinto的答案,您可以使用我的小脚本来修复损坏的程序包,该脚本将创建带有Equivs的虚拟程序包并进行安装。您可以在我的博客上用法语找到一篇文章。

或直接依据要点代码

要使用它:

$ ./gen-dummy-package.sh --install|i [packageName]+
# e.g. :
$ ./gen-dummy-package.sh -i rfkill nome-bluetooth bluez
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.