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

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

评论

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

是的,Postfix是从源安装的。

Debian的mailx包仅“推荐” exim4,不需要它。如果您不想安装推荐的软件包,只需添加APT :: Install-Recommends“ false”;转到您的apt.conf。

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

#1 楼

简单易用的解决方案:只需在每个不需要的软件包后面加上一个额外的-

不带-开关的示例:

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依赖性,则可以稍后再对其进行查询!

评论


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

–尼尔
16年2月11日,0:02

这正是我所需要的! (安装gnupg2而不使用pinentry-gtk2以避免X deps)

–lapo
16年8月27日在13:34

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

–罗夫
18年1月14日在22:11



仅适用于可选依赖项,不适用于必需的依赖项。错误信息:取决于:xxx,但是不会被安装。您可以使用apt-get install --no-install-recommends PACKAGE跳过所有可选软件包

– koppor
18年4月5日,0:06

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

– artfulrobot
19年1月28日在19:39

#2 楼

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


解压缩deb:ar x golden-linux.deb(将创建三个文件:debian-binary control.tar.gz data.tar.gz)
解压缩控件归档文件:tar xzf control.tar.gz(将创建:postinst postrm preinst prerm md5sums控件)
修复control中的依赖项(使用文本编辑器)
重新打包control.tar.gz:tar --ignore-failed-read -cvzf control.tar.gz {post,pre}{inst,rm} md5sums control

重新打包deb:ar rcs newpackage.deb debian-binary control.tar.gz data.tar.gz(重要的顺序!请参阅[Note])

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

评论


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

–Felipe Alcacibar
13年7月18日在16:36

我也谢谢你我必须使用它,因为应用程序需要libmng1.so.1,即使它与设置为libmng1.so.2的符号链接完美配合也是如此。 apt-get只是不能被套住,并一直困扰着我关于未满足的依赖项(即使安装了完全不相关的东西!)。多么垃圾的概念。

–syntaxerror
2014-12-15在2:45



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

–布雷特
16年5月23日在16:30



另一个建议。对于#4:添加--ignore-failed-read,以便tar忽略命令行其余部分中丢失的文件。 (例如,许多软件包中没有prerm,postrm。)此外,在Debian档案格式的较新版本(例如data.tar.xz)中,压缩包可以是.xz而不是.gz。

–丹·伦斯基
18年1月9日在17:19



我认为可以在serverfault.com/a/859394/312306上以“更清洁”的方式进行操作

–SebMa
19年5月2日在16:31

#3 楼

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

评论


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

– Zmicier Zaleznicenka
15年6月18日在9:20

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

–约翰
15年12月30日在19:08

这使我感到毛骨悚然,但是它完美地工作了!

–David Schmitt
18/12/19在13:16

#4 楼

您可以尝试使用带有--nodepsapt-get标志。
,或者下载该软件包并使用带有选项dpkg--ignore-depends安装它。

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

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


评论


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

– tshepang
2011-3-22在12:25



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

–炖
2011-3-23在20:13

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

–基督徒
13年7月12日在4:10

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

–弗雷德里克·罗斯(Frederick Roth)
15年1月8日在9:14

--no-install-recommends对我有用。

– OlleHärstedt
16-10-13在18:45

#5 楼

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

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

评论


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

–基督徒
13年7月12日在7:36

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

–地毯
16年4月23日在15:36

#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


#7 楼

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

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

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


评论


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

– drpexe
16-10-6在18:42

#8 楼

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

我也一直在寻找-nodeps选项来进行apt-get,但是它没有用,所以结束了

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

我在这里添加了它因为就我而言,它解决了类似的问题,并且尚未提及“ --no-install-recommends”的提示。

#9 楼

在我的debian系统上,bsd-mailx实际上取决于default-mta | mail-transport-agent(对于归档文件中的任何内容,您可以使用apt-cache show <pkg>来检查软件包所依赖的内容;对于已安装的软件包,您可以使用dpkg -s <pkg>来检查该软件包所依赖的内容。

这可能是因为您的postfix软件包没有没有Provides: mail-transport-agent,因此apt不会意识到您已经安装了MTA。如果它是官方软件包,则值得为此提交一个错误。

#10 楼

为此,您可以只安装钉子,我认为这些钉子没有这些依赖项?

apt-get install nail


#11 楼

这是我开发lansmtpd的原因之一。它不是很抛光,但是我目前没有安装postfixexim4使用它。 (我最终将对其进行抛光,使其更易于安装。)

另一个好处是,如果这样配置,即使Internet断开,来自cron的电子邮件也会在局域网上的所有计算机上传递。

#12 楼

好吧-别。

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

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

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

如果由于某种原因,服务器的维护工作转移给了其他人(例如,您的项目变得非常成功,您决定当您忙于其他工作时,请其他人来管理服务器),他自然会希望运行dpkg --get-selections来获取所有已安装的软件包。

请尽可能多地使用发行版的软件包管理软件。如果找不到预构建的软件包,您将学会构建自己的软件包,您将成为更好的专业人员。