Linux

設置 apt-get 選項以容忍無害的 ‘dpkg –force-conflicts’ 混亂?

  • April 24, 2017

通過執行foo可以使一個簡單衝突的包foo 與bar一起使用dpkg --force-conflicts -i foo。但最終是時候升級和“apt-get”對象了:

% apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
You might want to run 'apt-get -f install' to correct these.
The following packages have unmet dependencies:
foo : Conflicts: bar but 0.2-1 is installed
E: Unmet dependencies. Try using -f.

可以調整/強制apt-get以容忍(幾乎固定的)衝突,然後升級嗎?

(快速存在證明:解除安裝foo,然後升級,然後像以前一樣重新安裝foo。因此,可能,問題是找到最不麻煩的機制。)


一個例子,但這個問題與任何兩個特定的包無關。

幾年來,GNU並行moretutils發生了小衝突。每個都提供**/usr/bin/parallel**。 dpkg可以強制共存:

# assume 'moreutils' is already installed, and 'parallel' is in
# apt's cache directory.
dpkg --force-conflicts -i /var/cache/apt/archives/parallel_20141022+ds1-1_all.deb

這會造成轉移,將moreutils版本重命名為**/usr/bin/parallel.moreutils**。這兩個程序都可以工作,直到使用者升級。

我嘗試了一個**-o**選項,但這並沒有帶來和平:

apt-get -o Dpkg::Options::="--force-conflicts" install parallel moreutils

可能的**-o**選項有數百個,但是……

由於 OP 在 Gilles 答案的評論中要求提供命令列表(用於更改包的相關元數據),因此它是:

# download .deb
apt download parallel
# alternatively: aptitude download parallel

# unpack
dpkg-deb -R parallel_*.deb tmp/

# make changes to the package metadata
sed -i \
 -e '/^Version:/s/$/~nomoreutconfl/' \
 -e '/^Conflicts: moreutils/d' \
 tmp/DEBIAN/control

# pack anew
dpkg-deb -b tmp parallel_custom.deb

# install
dpkg -i parallel_custom.deb

這是假設衝突行僅moreutils作為條目(並且沒有版本限制),就像我的安裝中的情況一樣。否則,'/^Conflicts:/s/\(, \)\?moreutils\( [^,]\+\)\?//'作為第二個sed腳本使用,僅刪除行的相關部分並支持版本限制。

您安裝的軟體包不會被儲存庫中的較新版本覆蓋,如果您想保持此軟體包最新,則必須手動重複此過程以對 GNU 並行軟體包進行每次更新。

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