我如何去忽略某些依赖关系?


86

如何使apt-get忽略某些依赖项?例如,我想安装mailx,以便可以使用它从cron脚本/报告生成工具发送电子邮件。但是,安装mailx还会安装exim4和一堆我确实不需要的依赖项(我已经安装了Postfix),我猜想mailx也可以不用。

我如何忽略某些依赖关系,但由于它是一个很好的工具,仍然使用apt-get?


后缀如何安装?通过debian软件包?还是您从源代码安装了postfix?

是的,Postfix是从源代码安装的
FrancisV 2011年

3
Debian的mailx包仅“推荐” exim4,不需要它。如果您不想安装推荐的软件包,只需将添加APT::Install-Recommends "false";到中即可apt.conf
ruief 2014年

我在unix.stackexchange.com上找到了满意的答案;unix.stackexchange.com/a/404449/23542
artfulrobot

Answers:


45

简单易用的解决方案:只需-在每个不需要的软件包后加上多余的内容即可。

不带-开关的示例:

root@debian:~# apt-get install bsd-mailx 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  exim4-base exim4-config exim4-daemon-light liblockfile-bin liblockfile1
[...]

避免 使用开关的示例exim4-base。请注意-结尾:

root@debian:~# apt-get install bsd-mailx exim4-base-
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package 'exim4-base' is not installed, so not removed
The following extra packages will be installed:
  liblockfile-bin liblockfile1 ssmtp
[...]

如您所见,apt-get不再尝试安装该exim4-base软件包,也不再尝试安装其各种依赖项(exim4-config等)。

而且,如果您错了,并且exim4-base毕竟需要该依赖关系,则可以apt-get install稍后再处理!


5
这是避免安装任何特定依赖项的最佳方法。其他答案要么避免安装所有依赖项,要么在安装依赖项后将其卸载,要么建议乏味地编辑软件包。
尼尔

1
这正是我所需要的!(安装gnupg2pinentry-gtk2以避免X DEPS)
拉普

但是,那真的很棒,在我的情况下,apt-get拒绝安装具有“未满足的依赖项”(我使用此方法指定的)的软件包。特别是100 MB的文档包,我不在乎。
罗尔夫

3
仅适用于可选的依赖项,不适用于必需的依赖项。错误信息:Depends: xxx but it is not going to be installed。您可以使用apt-get install --no-install-recommends PACKAGE
koppor '18

也不适用于虚拟软件包。但请参阅unix.stackexchange.com/a/404449/23542
artfulrobot

55

您可以像这样更改deb包的依赖项:

  1. 解压deb :(ar x golden-linux.deb将创建三个文件:debian-binary control.tar.gz data.tar.gz)
  2. 解压控件存档:(tar xzf control.tar.gz将创建:postinst postrm preinst prerm md5sums控件)
  3. 修复依赖关系control(使用文本编辑器)
  4. 重新包装control.tar.gz: tar --ignore-failed-read -cvzf control.tar.gz {post,pre}{inst,rm} md5sums control
  5. 重新包装deb :(ar rcs newpackage.deb debian-binary control.tar.gz data.tar.gz重要命令!请参阅[Note])

[注意]:如果dpkg必须搜索数据部分的结尾,它将无法快速读取该软件包的元数据!


2
很好,它为我解决了从“ raring8”到“ raring6”的特殊依赖情况,但是相同的版本=(,非常感谢
Felipe Alcacibar

1
我也谢谢你 我之所以必须使用它,是因为libmng1.so.1即使将符号链接设置为,它也可以正常工作,但仍需要一个应用程序libmng1.so.2apt-get只是无法被笼罩,并一直让我烦恼未满足的依赖关系(即使安装了完全不相关的东西!)。多么垃圾的概念。
语法错误

+1这对我来说也很完美。包gnome-settings-daemon想要,gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11但我已经有了gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11.2(<-注意最后的“ .2”)。通过此过程,我可以编辑程序包并强制其使用较新的11.2版本。谢谢!
埃里克·邓肯

1
很好的解决方案,谢谢。我对步骤2和4进行了一些修改:2. FILES=$(tar zxvf control.tar.gz)将文件列表存储在变量中。4. tar zcf control.tar.gz $FILES-创建没有管,可在单个步骤中存档或重定向使用原始文件列表(修改后)。
布雷特

2
另一个建议。对于#4:添加,--ignore-failed-read以便tar忽略命令行其余部分中丢失的文件。(例如,prermpostrm是从许多包不存在的。)另外,压缩包可以.xz,而不是.gz在Debian文档格式(例如新版本data.tar.xz)。
丹·伦斯基

33

使用--ignore-depends 选项安装软件包后,请去编辑/var/lib/dpkg/status文件,并删除您认为不需要的任何依赖项。请非常小心。为了一个部门。被需要,就非常有可能更BE需要


3
更新后/var/lib/dpkg/status,可能需要完成安装sudo apt-get -f install(无需指定软件包)。
Zmicier Zaleznicenka 2015年

也可以在这里找到:superuser.com/a/815371/127024
2015年

这使我感到毛骨悚然,但是它运行得非常完美!
David Schmitt '18

25

您可以尝试使用--nodeps标记apt-get
或下载软件包并使用dpkg选件进行安装--ignore-depends

例如,如果要安装foo不依赖的软件包bar

dpkg --ignore-depends=bar -i foo_1.2.3_amd64.deb

52
您拥有哪个APT版本?我的(0.8.10)没有这样的选择。
tshepang 2011年

8
告诉dpkg忽略依赖关系不是他的选择。它仅告诉dpkg忽略此事务的依赖关系,它将在下一次执行任何操作时尝试满足这些依赖关系或删除pacakge。

2
APT 0.8.16 BTW仍然没有运气。太糟糕了,因为似乎没有合理的选择。您在2011年使用了哪个版本来使其正常工作?
基督教徒

2
您可以使用apt-get下载,然后使用dpkg
Frederick Roth

7
--no-install-recommends为我工作。
OlleHärstedt'16

14

由于从源代码安装了postfix,因此需要安装一个“虚拟”软件包,该软件包将满足mailx(或bsd-mailx)的邮件传输代理依赖关系。存在于debian中的“ equivs”软件包可以创建这样的虚拟软件包,您可以安装该软件包以告诉dpkg“满足此依赖性”

告诉dpkg仅忽略依赖项不是一个好的解决方案,原因是您只告诉dpkg / apt对单个事务忽略它,而不能告诉它永远忽略依赖项。每次使用apt时,它都会检查所有软件包的依赖关系


2
另请参阅此答案,该答案链接到教程superuser.com/a/416560/128960(尽管过于复杂)。简短的版本是:运行equivs-control <name>,编辑生成的文件以提供正确的依赖关系并使用一个漂亮的名称,然后运行equivs-build <name>,最后运行dpkg -i生成的.deb文件。
基督教徒

1
恕我直言,这确实是最好的解决方案。这里要求的所有其他解决方案都太过简陋。只需完成一次,然后您就可以根据自编译的软件安装任何软件了……因此,我们赞成这个答案!
rug

7

我一直在运行Xen的Ubuntu 12.04 Server上寻找此选项。在我的域中,我使用-virtual内核,并且在每次内核软件包升级时都不断尝试安装grub。但是,使用p [yv] grub时,domU内部不需要使用grub。

我也一直在寻找-nodeps选项来apt-get,但是它没有用,所以最终在每次内核升级后都卸载/清除grub *。

毕竟,真正阅读手册页有时会有所帮助-事实证明,在12.04上使用类似的apt-get选项似乎是--no-install-recommends,在这种情况下该方法实际上是有效的,因为grub在手册中列为“推荐”。包信息(我想它不是“真正的”依赖项吗?)。

我将其添加到此处是因为在我的情况下,它解决了类似的问题,并且尚未提及“ --no-install-recommends”的提示。


6

您可以使用apt-get下载该软件包,然后使用dpkg安装该软件包,手动列出您希望忽略的依赖关系。

例如,如果我要下载mypackage但它依赖于libperl5.14,而我又不想安装libperl5.14,因为我的版本不同,则可以忽略此依赖性,如下所示:

apt-get download mypackage
dpkg -i --ignore-depends=libperl5.14 mypackage.deb

只需提及,这会使您容易“崩溃”。在修复丢失的依赖项之前,它不会让您安装其他软件包。
drpexe

6

手动调整依赖项的另一种方法是:

apt-get download yourpackage
dpkg-deb -x yourpackage.deb PackageFolder
dpkg-deb --control yourpackage.deb PackageFolder/DEBIAN
vim PackageFolder/DEBIAN/control
dpkg -b PackageFolder yourpackage2.deb
apt-get install ./yourpackage2.deb

2

在我的debian系统上,bsd-mailx实际上取决于default-mta | mail-transport-agent(您可以检查软件包中所依赖apt-cache show <pkg>的文件是否有任何档案或dpkg -s <pkg>已安装的软件包。

可能是您的postfix软件包没有,Provides: mail-transport-agent所以apt并没有意识到您已经安装了MTA。如果是官方程序包,那就应该为此提交一个错误。



-5

好吧-不要

在成功的道路上,利用他人的工作非常重要。从源代码(tarball)构建某些软件时,您会错过使用发行版的程序包管理器工作的机会。

您将不会获得“免费”更新。大多数时候,没有人从源头更新过它们安装的软件包。因为他们需要跟踪软件的新版本,所以重建它和所有依赖程序(请记住它们)。

您的发行版存储库中的其他软件包将有问题。这正是问题中提到的情况:ubuntu有一个出色的软件包管理器,并且一些非常好的人维护软件包。他们决定,要使mailx程序正常工作,您需要MTA。因此,如果您从ubuntu来源安装了postfix,则不会要求您安装exim。

如果由于某种原因将服务器的维护工作转移给其他人(例如,您的项目变得非常成功,并且您决定在忙于其他事情的同时聘请其他人来管理服务器),那么他自然会期望dpkg --get-selections能够获得所有已安装的软件包。

尝试尽可能使用发行版的软件包管理软件。如果找不到预编译的软件包,则学习构建自己的软件包,您将成为更好的专业人员。

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.