Ubuntu

apt-get 無法正確解決對 Debian/Ubuntu 軟體包中固定版本的依賴

  • September 9, 2021

我有一個自定義包foo,它在控製文件中依賴於另一個包的固定版本bar

Depends: bar (= 1.2.3)

foo和包都bar發佈在我自己的倉庫中。此外,我在 repo 中有多個版本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.

apt 解析器不會考慮您可能想要安裝的東西不是給定目標版本中軟體包的最新可用版本的可能性;Debian 只是不支持安裝任何東西,只為您的系統安裝最新版本的軟體包。

如果您為(一組)軟體包的每個版本使用不同的儲存庫,那麼您可以使用 pinning 來選擇給定的來源,或者給它們一個不同的代號並使用 apt 的 -t 選項來選擇目標版本。否則就是不可能的。

引用自:https://unix.stackexchange.com/questions/350192