我正在研究一些机器设置说明,我很惊讶地发现它的apt-get install A B
行为与不同apt-get install A && apt-get install B
。
我的具体例子是A == openjdk-7-jdk
和B == ant
。
因此,openjdk-7-jdk
依赖于openjdk-7-jre-headless
,这满足了ant
的依赖性 java6-runtime-headless
。但是,如果您将它们安装为apt-get install openjdk-7-jdk ant
,APT 似乎无法解决这个问题并安装default-jre-headless
。但是,如果您openjdk-7-jdk
在安装 之前安装ant
,则其依赖性得到满足,一切正常。
APT 通常足够聪明,能够解决这类问题,那么为什么在这种情况下它做不到呢?我希望更好地理解它为什么会这样工作,这样以后我就不会再遇到这种事情了。
答案1
似乎这里有某种“重量”系统在起作用:
$ aptitude why ant openjdk-7-jdk
p ant Recommends ant-optional
p ant-optional Suggests libgnumail-java
p libgnumail-java Suggests libgnumail-java-doc
p libgnumail-java-doc Recommends default-jdk-doc
p default-jdk-doc Depends openjdk-7-doc
p openjdk-7-doc Suggests openjdk-7-jdk
如你所见,ant
由于openjdk-7-jdk
建议、推荐和依赖关系的复杂性,而使用openjdk-6-jdk
依赖关系则更直接:
$ aptitude why ant openjdk-6-jdk
p ant Suggests default-jdk | java-compiler | java-sdk
p openjdk-6-jdk Provides java-sdk
当然aptitude
,依赖解析的方法可能有所不同apt-get
。顺便说一句,在没有安装 openjdk-7-jdk 的情况下运行 ant 模拟,不要拉取 openjdk-6-jdk:
$ sudo apt-get install ant
[sudo] password for braiam:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
ant-optional
Suggested packages:
default-jdk java-compiler java-sdk ant-gcj ant-doc liboro-java junit
libregexp-java jython antlr libbcel-java libjdepend-java libgnumail-java
libcommons-net-java libjsch-java javacc ant-optional-gcj
The following NEW packages will be installed:
ant ant-optional
0 upgraded, 2 newly installed, 0 to remove and 9 not upgraded.
Need to get 2,234 kB of archives.
After this operation, 3,041 kB of additional disk space will be used.
Do you want to continue [Y/n]?
也许如果您使用与我相同的方法,您就可以了解更多,因为我现在正在使用 Debian 测试,并且存储库可能在此期间发生变化。
答案2
据我所知,它具有满足依赖关系的默认值,因此如果在安装包之前尚未满足该依赖关系,它会安装依赖关系,然后安装请求的包。
但这也可能只是一个大错误。
无论如何,希望有所帮助。