就在今天,嘗試更新 Ubuntu 14.04:
$ sudo apt-get update # ...
$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
phablet-tools ubuntu-sdk ubuntu-sdk-ide
The following packages will be upgraded:
cgroup-lite curl libcurl3 libcurl3-gnutls python3-update-manager
update-manager update-manager-core xserver-xorg-core-lts-xenial
8 upgraded, 0 newly installed, 0 to remove and 3 not upgraded.
Need to get 2,305 kB of archives.
After this operation, 13.3 kB of additional disk space will be used.
Do you want to continue? [Y/n] ^C
好的,所以我從這裡收集到phablet-tools
,ubuntu-sdk
軟體包ubuntu-sdk-ide
在此更新中發生了依賴項更改,因此我必須調用dist-upgrade
;所以我這樣做:
$ sudo apt-get dist-upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages were automatically installed and are no longer required:
at dctrl-tools devscripts distro-info-data dput intltool
libcommon-sense-perl libdistro-info-perl libexporter-lite-perl
libio-stringy-perl libjson-perl libjson-xs-perl libparse-debcontrol-perl
unity-scope-tool
Use 'apt-get autoremove' to remove them.
The following NEW packages will be installed:
autopilot-desktop gir1.2-gconf-2.0 gir1.2-upstart-app-launch-2
libautopilot-gtk libautopilot-qt liblxc1 libseccomp2 libxpathselect1.4
lxc-common lxcfs lxd lxd-client python-autopilot python-autopilot-trace
python-autopilot-vis python-contextlib2 python-decorator python-evdev
python-extras python-fixtures python-junitxml python-mimeparse python-psutil
python-subunit python-testscenarios python-testtools squashfs-tools
ubuntu-sdk-tools uidmap
The following packages have been kept back:
ubuntu-sdk
The following packages will be upgraded:
cgroup-lite curl libcurl3 libcurl3-gnutls python3-update-manager
ubuntu-sdk-ide update-manager update-manager-core
xserver-xorg-core-lts-xenial
9 upgraded, 29 newly installed, 0 to remove and 1 not upgraded.
Need to get 50.2 MB of archives.
After this operation, 66.9 MB of additional disk space will be used.
Do you want to continue? [Y/n] ^C
首先,ubuntu-sdk
仍然被阻止 - 但現在我還需要刪除大量的軟體包,因為“不再需要”,以及大量的軟體包需要安裝。這讓我很惱火,因為我無法分辨哪個特別是,軟體包(依賴項)會導致安裝新軟體包或由於「不再需要」舊軟體包而被刪除。
所以我的問題是 - 是否有某種詳細模式或開關apt-get
或aptitude
類似程序可以列出從當前版本到新版本的依賴項更改?我知道我能做到:
$ apt-cache depends ubuntu-sdk
ubuntu-sdk
Depends: autopilot-desktop
Depends: intltool
Depends: phablet-tools
Depends: ubuntu-device-flash
Depends: ubuntu-sdk-ide
……但我將此視為當前版本的狀態;我想要的是(偽代碼)
$ apt-command --show-dependency-changes ubuntu-sdk
ubuntu-sdk:
Installed: 1.126.2~0ubuntu1~trusty2 # as in 'apt-cache policy ubuntu-sdk'
Candidate: 1.266~0ubuntu1~0trusty
Depends: autopilot-desktop (installed v. XXX, candidate no longer required)
Depends: intltool (installed v. XXX, candidate v. YYY)
Depends: dctrl-tools (installed no dependency, candidate v. YYY)
...
……即我想要詳細解釋為什麼要新安裝或刪除特定軟體包的原因。
外面有這樣的事嗎?
答案1
從 的手冊頁來看apt-get
,upgrade
指令 do
...目前安裝的可用新版本的軟體包被檢索和升級;在任何情況下都不會刪除目前安裝的軟體包,也不會檢索和安裝尚未安裝的軟體包。目前安裝的軟體包的新版本如果不更改另一個軟體包的安裝狀態就無法升級,將保留其目前版本。
這意味著,apt-get upgrade
在升級時不會安裝或刪除軟體包。即使軟體包有更高版本可用。在這種情況下,該特定包(以及此所需的任何關聯包)將被保留。這是為了系統的安全。
但是,從 的手冊頁來看apt-get
,dist-upgrade
是
dist-upgrade 除了執行升級功能外,還可以智慧地處理新版本軟體包的依賴關係變化; apt-get 有一個「智慧」衝突解決系統,如有必要,它會嘗試升級最重要的軟體包,而犧牲不太重要的軟體包。因此,dist-upgrade 命令可能會刪除一些軟體包。
所以,在這裡我們看到,dist-upgrade
比…更殘酷upgrade
。它將嘗試安裝更新版本的重要的即使這需要刪除某些軟體包和/或安裝較新的軟體包。這就是為什麼 dist-upgrade 可以觸發其他軟體包的安裝/刪除,就像您在問題中的情況一樣。
另請注意,包held-back
也可以用於其他一些情況,例如固定。如果您固定某個軟體包,則該軟體包不會升級。
held-back
當由於缺少一個或多個依賴套件而無法安裝較新版本的套件時,也可能會發生這種情況。
我想要詳細解釋新安裝或刪除特定軟體包的原因。
一種有用的技術是記下將要安裝的套件名稱並手動檢查其版本之間的依賴關係變更。
ubuntu-sdk
對於您的特定情況,您可以檢查使用apt-cache depends ubuntu-sdk=<version-installed>
和的依賴關係變更apt-cache depends ubuntu-sdk=<version-candidate>
。您會看到較新的版本需要額外的軟體包。
您也可以使用aptitude safe-upgrade
(for upgrade
) 或aptitude full-upgrade
for ( dist-upgrade
),當它顯示要安裝和/或刪除的軟體包清單時,按d查看依賴資訊。或者當您使用時full-upgrade
,您可以按哦查看它建議的依賴解析解決方案。這將向您展示為什麼要安裝或刪除軟體包。
檢查這些連結以了解更多資訊 -