使用apt-get忽略特定软件包的所有依赖关系


16

这是一个非常具体的问题,Google对此没有帮助。

我正在使用运行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由于依赖关系未得到满足,以后再安装其他任何工具都会失败。因此,如果我想在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。几个答案提供了方便的手动步骤来修改某些程序包的依赖关系。

我仍在寻找一种强大的自动化方法。


您是否尝试过--nodepsapt-get)或--ignore-dependsdpkg
Mike Koch 2014年

Answers:


27

我理解bjanssen的观点,但是对于程序包管理器只允许--force-depends安装一个程序包似乎是很荒谬的,但不允许强制永远依赖并停止警告我这种依赖性。

我遇到了一个类似的问题,该软件包依赖于libcairo版本,该版本略高于Debian中当前提供的版本。对我来说,它仍然可以正常工作。我很高兴继续使用它,直到apt中出现libcairo更新为止。我不想从源代码编译或构建自己的包。

我发现的解决方案:

  • 编辑/var/lib/dpkg/status
  • 查找依赖项损坏的包
  • 编辑该Depends:行以停止程序包抱怨。

我认为下次更新包时将覆盖它,但这正是我想要的。


2
这是完美的,正是我需要临时解决不正确的PPA依赖关系所需要的!
Cas

2

您试图做的事情与程序包管理器的目的相反,程序包管理器试图保持一个理智的环境,因为您使用了错误的工具来完成工作。不要试图打破apt-get。

解决问题的正确方法是使用适合您的依赖关系构建自己的程序包。有一种正式的方式(涉及很多:http : //www.debian.org/doc/manuals/maint-guide/index.en.html),还有一种快速而又肮脏的方式,使用apt-build,或者对于不在发行源中的软件包,checkinstall。所有生产软件包apt-get都会很高兴安装。

最后,您可能会质疑esl-erlang的维护者是否包括某些依赖项,但是您不能因为预期的行为而对软件包管理器提出错误。如果您认为这些依赖关系是错误的,则应向软件包提交错误。


您所说的“包管理器的目的”基本上是正确的,但是您也不应该一概而论。我想举一个例子:需要一个应用程序libmng1。但是我已经libmng2安装了AND链接设置为libmng1.so。工作过威胁,从来没有任何问题。但apt-get总是抱怨“未满足的依赖关系”。因此,绝对有充分的理由试图找到在这方面保持沉默的方法。由于事情的工作,它只是不断抱怨的事情,仅仅没有问题的。它只是看到没有问题的地方。这很烦人。
语法错误

这是一个奇怪的情况。我猜您是从非分发存储库安装软件包的?在这种情况下,请看一下equivs“沉默” apt-get而不破坏它。
bjanssen

好吧,可能是那样的。但实际上并非如此。我只是从同一个发行版中安装了较旧的软件包,因此在Ubuntu术语中,我使用的是15.x,但我从12.04 LTS安装了libmng1。
语法错误

0

检查中的“使用的代理” apt.conf是否正确(即根据您的网络)。由于网址将无法访问,因此这也会导致此类问题。

通常,如果您使用代理,则您/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>/";
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.