使用 apt-get 忽略特定包的所有依赖项

使用 apt-get 忽略特定包的所有依赖项

这是一个非常具体的问题,谷歌没有帮助回答。

我正在运行 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>/";

相关内容