为什么 apt 认为它需要这种额外的依赖?

lee*_*777 9 package-management apt

我正在研究一些机器设置说明,我惊讶地发现它的apt-get install A B行为与apt-get install A && apt-get install B.

我的具体例子是A == openjdk-7-jdkB == 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 通常足够聪明来解决这类问题,那么为什么在这种情况下不能这样做呢?我想更好地了解为什么它会以这种方式工作,这样以后就不会再遇到这种事情了。

Bra*_*iam 2

似乎这里有某种“重量”系统在起作用:

$ 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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,antdependsopenjdk-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
Run Code Online (Sandbox Code Playgroud)

当然,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]? 
Run Code Online (Sandbox Code Playgroud)

也许如果您使用与我相同的方法,您可以了解更多,因为我现在正在使用 Debian 测试,同时存储库可能会发生变化。


小智 0

AFAIK,它具有满足依赖项的默认值,因此如果在安装包之前尚未满足该依赖项,它将安装依赖项,然后安装请求的包。

不过,这也可能只是一个大错误。

不管怎样,希望有帮助。