![使用 apt-get 忽略特定包的所有依赖项](https://linux22.com/image/1404418/%E4%BD%BF%E7%94%A8%20apt-get%20%E5%BF%BD%E7%95%A5%E7%89%B9%E5%AE%9A%E5%8C%85%E7%9A%84%E6%89%80%E6%9C%89%E4%BE%9D%E8%B5%96%E9%A1%B9.png)
这是一个非常具体的问题,谷歌没有帮助回答。
我正在运行 Ubuntu 13.04 apt 0.9.7.7ubuntu4 for amd64 compiled on Oct 3 2013 15:25:56
。
我想从 .deb 包安装 Erlang,但我不想提取其所有依赖项。包本身指定它依赖于 Java 和 wx 库,但实际上除非您想与 Java 或 wxWidgets 交互,否则不需要这些库。
我可以像这样安装 Erlang
sudo dpkg -i --force-depends erlang.deb
apt-get
但是,由于依赖项未得到满足,因此使用 after 安装其他任何程序都会失败。因此,如果我想在 Erlang 之后安装 git,则会得到以下信息
$ sudo apt-get install -y git
Reading package lists...
Building dependency tree...
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
esl-erlang : Depends: default-jre-headless but it is not going to be installed or
java2-runtime-headless or
java1-runtime-headless or
java2-runtime or
java1-runtime
Depends: libwxbase2.8-0 but it is not going to be installed
Depends: libwxgtk2.8-0 but it is not going to be installed
Recommends: erlang-mode but it is not going to be installed
git : Depends: libcurl3-gnutls (>= 7.16.2-1) but it is not going to be installed
Depends: perl-modules but it is not going to be installed
Depends: liberror-perl but it is not going to be installed
Depends: git-man (> 1:1.7.9.5) but it is not going to be installed
Depends: git-man (< 1:1.7.9.5-.) but it is not going to be installed
Recommends: patch
Recommends: rsync
Recommends: ssh-client
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).
有没有办法让esl-erlang
包在不运行的情况下闭嘴apt-get install -f
?
我想要这样的东西:
sudo apt-get install --ignore-deps-for-package=esl-erlang git
或者像这样:
sudo apt-cache shut-package-up esl-erlang
或这个:
sudo apt-get download git
sudo dpkg -i --with-deps git.deb
我发现了一个类似的问题:https://serverfault.com/questions/250224/how-do-i-get-apt-get-to-ignore-some-dependencies。有几个答案提供了方便的手动步骤来修改某些包的依赖关系。
我仍在寻找一种强大的自动化方法。
答案1
我理解 bjanssen 的观点,但包管理器允许--force-depends
安装单个包,但不允许强制永远依赖并停止警告我有关此依赖性,这似乎很荒谬。
我遇到过类似的问题,因为某个软件包所依赖的 libcairo 版本比 Debian 中当前可用的版本略高。就我而言,它仍然运行良好。我很乐意继续使用它,直到 libcairo 更新出现在 apt 中。我不想从源代码编译或构建自己的软件包。
我找到的解决方案:
- 编辑
/var/lib/dpkg/status
, - 找到依赖关系损坏的包
- 编辑该
Depends:
行以停止软件包抱怨。
我假设下次更新包时它将被覆盖,但这正是我想要的。
答案2
您尝试做的事情违背了包管理器的宗旨,即尝试保持一个合理的环境,也就是说,您使用的工具不对。不要试图破坏 apt-get。
解决问题的正确方法是构建自己的软件包,其中包含适合您的依赖项。这是官方方法(相当复杂:http://www.debian.org/doc/manuals/maint-guide/index.en.html) 以及使用 的快速而肮脏的方法apt-build
,或者对于分发源中没有的软件包,checkinstall
。 apt-get 将很乐意安装所有生成的软件包。
最后要说的是,您可能会质疑 esl-erlang 维护者是否明智地包含某些依赖项,但您不能因为预期的行为而指责包管理器。如果您认为这些依赖项有误,则应向包提交错误报告。
答案3
检查“使用的代理”是否apt.conf
正确(即是否符合您的网络)。这也会导致此类问题,因为 URL 无法访问。
通常,如果您使用代理,那么您的/etc/apt/apt.conf
看起来会像这样:
Acquire::ftp::proxy "ftp://<user>:<password>@<ip>:<port>/";
Acquire::http::proxy "http://<user>:<password>@<ip>:<port>/";
Acquire::https::proxy "https://<user>:<password>@<ip>:<port>/";