apt-get 无法正确解决 Debian/Ubuntu 软件包中固定版本的依赖关系

apt-get 无法正确解决 Debian/Ubuntu 软件包中固定版本的依赖关系

我有一个自定义包foo,其控制文件依赖于另一个包的固定版本bar

Depends: bar (= 1.2.3)

foo和软件包都bar发布在我自己的存储库中。此外,我bar在存储库中有多个版本,例如 1.2.3 和 2.1.0。现在,当尝试foo使用以下命令在新机器上安装时

apt-get install foo

它失败了

The following packages have unmet dependencies:
 foo : Depends: bar (= 1.2.3) but 2.1.0 is to be installed

即 apt-get 似乎无法正确找出要使用的软件包的正确版本。

我尝试添加冲突:

Depends: bar (= 1.2.3)
Conflicts: bar (>> 1.2.3)

但这只会导致错误更改为

The following packages have unmet dependencies:
 foo : Depends: bar (= 1.2.3) but it is not going to be installed

如果我在安装时指定 bar 的版本,则可以:

apt-get install foo bar=1.2.3

但这是不可行的(实际情况具有多个级别的依赖关系,我真的不想实现自己的依赖关系解析器以便在命令行上手动查找和指定所有内容 -apt在这种情况下最好跳过)。

所以问题是,有没有什么方法可以让行为正确并自动安装正确版本的依赖项(而不必在命令行上显式指定这些版本)?我应该补充一点,我也真的不想通过版本固定走 apt_preferences 路线,因为这需要在两个不同的地方管理版本。

为了完整起见,以下是打开各种 apt 调试输出时的完整输出:

apt-get -o Debug::pkgProblemResolver=1 -o Debug::pkgDepCache::AutoInstall=1 -o Debug::pkgDepCache::Marker=1 install foo

Reading package lists... Done
Building dependency tree       
Reading state information... Done
  foo:amd64 Depends on bar [ amd64 ] < none -> 2.1.0 > ( universe/utils ) (= 1.2.3) can't be satisfied!
Starting pkgProblemResolver with broken count: 1
Starting 2 pkgProblemResolver with broken count: 1
Investigating (0) foo [ amd64 ] < none -> 1.0.0 > ( misc )
Broken foo:amd64 Depends on bar [ amd64 ] < none -> 2.1.0 > ( universe/utils ) (= 1.2.3)
  Considering bar:amd64 0 as a solution to foo:amd64 9998
  Re-Instated bar:amd64
Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 foo : Depends: bar (= 1.2.3) but 2.1.0 is to be installed
E: Unable to correct problems, you have held broken packages.

答案1

apt 解析器不会考虑您可能想要安装的东西不是给定目标版本中软件包的最新可用版本的可能性; Debian 只是不支持为您的系统安装除最新版本的软件包之外的任何内容。

如果您对(一组)包的每个版本使用不同的存储库,那么您可以使用固定来首选给定的来源,或者给它们一个不同的代号并使用 apt 的 -t 选项来选择目标版本。否则这是不可能的。

答案2

我知道现在帮助OP有点晚了,但我仍然发现很难通过Google解决这个实际有效的问题。当 apt-get 失败时,aptitude 解析器能够通过一些提示提出一个成功的解决方案:

aptitude install -o "Aptitude::ProblemResolver::Hints::=reject foo :UNINST" foo

基本上上面的提示依赖解析器说拒绝所有涉及“不安装”foo软件包的解决方案,并迫使 aptitude 解析器更加努力地尝试apt-get

相关内容