如何让 apt-get 忽略某些依赖项?

Fra*_*isV 118 email ubuntu debian dependencies apt

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

如何忽略某些依赖项但仍然使用 apt-get 因为它是一个不错的工具?

小智 79

简单易行的解决方案:只需-在每个包之后指定不需要的包。

没有-开关的例子:

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
[...]
Run Code Online (Sandbox Code Playgroud)

使用开关避免安装的 示例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
[...]
Run Code Online (Sandbox Code Playgroud)

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

如果你错了,exim4-base毕竟需要这种依赖,你可以apt-get install稍后再用!

  • 仅适用于可选的依赖项,而不适用于必需的依赖项。错误消息:`Depends: xxx but it's not going to be installed`。您可以使用 `apt-get install --no-install-recommends PACKAGE` 跳过所有可选包 (11认同)
  • 这是*避免安装*任何特定依赖项的最佳方式。其他答案要么避免安装所有依赖项,在安装后卸载依赖项,要么建议繁琐地编辑包。 (6认同)
  • 然而,这真的很棒,在我的情况下 apt-get 拒绝安装具有“未满足的依赖项”(我使用此方法指定)的包。特别是一个我不关心的 100 兆字节的文档包。 (3认同)
  • 也不适用于虚拟包。但请参阅https://unix.stackexchange.com/a/404449/23542 (2认同)

Jan*_*sen 67

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

  1. 解压 deb:(ar x golden-linux.deb将创建 ie 三个文件: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顺序很重要!见【注意】)

[注意]: dpkg 如果必须搜索数据部分的结束位置,将无法快速读取包的元数据!

  • 另一对夫妇的建议。对于 #4:添加 `--ignore-failed-read` 以便 `tar` 忽略命令行其余部分丢失的文件。(例如,在许多软件包中都没有 `prerm`、`postrm`。)此外,在较新版本的 Debian 存档格式中,tarball 可以是 `.xz` 而不是 `.gz`(例如 `data.tar.xz `)。 (3认同)
  • 很好,它为我解决了“raring8”到“raring6”的特殊依赖关系,但版本相同=(,非常感谢 (2认同)

小智 46

使用该--ignore-depends 选项安装软件包后,去编辑该/var/lib/dpkg/status文件,并删除您认为不需要的任何依赖项。只是要非常小心。为了一个dep。将必需的,但更可能以BE需要

  • 更新 `/var/lib/dpkg/status` 后,可能需要使用 `sudo apt-get -f install` 完成安装(无需指定包)。 (4认同)
  • 这让我毛骨悚然,但它完美无缺! (2认同)

Bar*_*Vos 29

您可以--nodeps使用apt-get.
或者下载软件包并使用dpkg选项安装它--ignore-depends

例如,如果你想安装foo没有依赖的包bar

dpkg --ignore-depends=bar -i foo_1.2.3_amd64.deb
Run Code Online (Sandbox Code Playgroud)

  • 你有哪个 APT 版本?我的 (**0.8.10**) 没有这样的选项。 (54认同)
  • 告诉 dpkg 忽略依赖不是他的选择。它只告诉 dpkg 忽略此事务的依赖项,它会尝试满足依赖项或在您下次执行任何操作时删除 pacakge。 (10认同)
  • `--no-install-recommends` 对我有用。 (9认同)
  • 您可以使用 apt-get 下载,然后使用 dpkg (3认同)
  • APT 0.8.16 BTW 仍然没有运气。太糟糕了,因为似乎没有合理的选择。你在 2011 年使用哪个版本来让它工作? (2认同)
  • apt download <package> 和 dpkg --ignore-depends=bar -i <package> 救了我的命!谢谢你! (2认同)

ste*_*tew 17

由于您从源代码安装了 postfix,因此您需要安装一个“虚拟”包,以满足 mailx(或 bsd-mailx)的 mail-transport-agent 依赖项。debian 中的“equivs”包存在来创建这样一个虚拟包,你可以安装它来告诉 dpkg“这个依赖是满足的”

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

  • 另请参阅链接到教程的答案(尽管它过于复杂)http://superuser.com/a/416560/128960。简短版本是:运行`equivs-control <name>`,编辑生成的文件以提供正确的依赖项并有一个好的名字,然后运行`equivs-build <name>`,最后`dpkg -i` 生成的.deb文件。 (4认同)
  • 恕我直言,这确实是最好的解决方案。这里要求的所有其他解决方案都有点太黑客了。这个只需要做一次,之后就可以根据自编译的软件来安装任何软件了……所以,让我们为这个答案点赞吧! (2认同)

小智 15

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

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
Run Code Online (Sandbox Code Playgroud)


小智 11

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

例如,如果我想下载 mypackage 但它依赖于 libperl5.14 而我不想安装 libperl5.14 因为我有一个不同的版本我可以忽略这个依赖如下:

apt-get download mypackage
dpkg -i --ignore-depends=libperl5.14 mypackage.deb
Run Code Online (Sandbox Code Playgroud)

  • 只是提一下,这会让你很容易“崩溃”。在修复丢失的依赖项之前,它不会让您安装其他软件包。 (5认同)

小智 7

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

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

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

我在这里添加这个是因为在我的情况下它解决了一个类似的问题,并且还没有提到“--no-install-recommends”的提示。