就在今天,尝试在 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
命令执行
... 检索并升级当前安装的具有新版本的软件包;在任何情况下都不会删除当前安装的软件包,也不会检索和安装尚未安装的软件包。如果不更改另一个软件包的安装状态,则无法升级当前安装的软件包的新版本将保留其当前版本。
这意味着,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
( dist-upgrade
),当它显示要安装和/或删除的软件包列表时,按d查看依赖项信息。或者在使用 时full-upgrade
,您可以按o查看其建议的依赖性解决方案。这将向您展示为什么要安装或删除某个包。
查看这些链接了解更多信息 -