Pourquoi apt pense-t-il avoir besoin de cette dépendance supplémentaire?

9

Je travaille sur certaines instructions de configuration de la machine, et j'ai été surpris de découvrir que cela apt-get install A Bpeut se comporter différemment apt-get install A && apt-get install B.

Mon exemple spécifique est A == openjdk-7-jdket B == ant.

Donc, openjdk-7-jdkdépend de openjdk-7-jre-headless, ce qui satisfait antla dépendance de java6-runtime-headless. Mais si vous les installez en tant que apt-get install openjdk-7-jdk ant, APT ne semble pas comprendre cela et installe default-jre-headless. Mais si vous installez openjdk-7-jdkavant l'installation ant, sa dépendance est satisfaite et tout va bien.

APT est généralement assez intelligent pour comprendre ce genre de chose, alors pourquoi ne peut-il pas le faire dans ce cas? J'aimerais mieux comprendre pourquoi cela fonctionne de cette façon, donc ce genre de chose ne me fera plus trébucher à l'avenir.

leedm777
la source
En regardant mon cache apt, je vois que openjdk-7-jdk 7 ~ u3-2.1.1 ~ pre1-1ubuntu2 dépend de openjdk-7-jre, qui à son tour dépend de openjdk-7-jre-headless, donc cette dépendance est indirecte . ant dépend directement de default-jre-headless. J'utilise Precise. Je ne fais que deviner, mais apt-get pourrait soit démarrer arbitrairement avec ant, soit commencer avec les dépendances de niveau 1, puis passer aux dépendances de niveau 2. Dans tous les cas, si vous vous souciez de la configuration finale des packages (voulez openjdk-7-jre-headless sur default -..- ..) les spécifier spécifiquement et individuellement est probablement le meilleur moyen de contrôler cela.
John S Gruber
Êtes-vous toujours intéressé par cette question?
guntbert
@guntbert Bien sûr, même si je me suis résigné à croire qu'il n'y a aucune raison; c'est comme ça.
leedm777
5
Pour voir comment fonctionne le résolveur APT, regardez apt-get install -o Debug::pkgProblemResolver=true package1 package2.... Cela pourrait vous donner une idée pourquoi cela fonctionne de cette façon.
Lasall

Réponses:

2

Il semble qu'il y ait une sorte de système de "poids" ici:

$ 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

Comme vous pouvez le voir, cela antdépend d' openjdk-7-jdkune quantité compliquée et complexe de suggestions, de recommandations et de dépendances, tandis que lors de l'utilisation de openjdk-6-jdkla dépendance est plus directe:

$ aptitude why ant openjdk-6-jdk
p   ant           Suggests default-jdk | java-compiler | java-sdk
p   openjdk-6-jdk Provides java-sdk

Bien sûr, les aptitudeméthodes de résolution des dépendances pourraient être différentes de celles apt-getde. BTW, exécuter une simulation de fourmi sans openjdk-7-jdk installé ne tire pas 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]? 

Peut-être que si vous utilisez les mêmes méthodes que moi, vous pourriez en comprendre plus, car j'utilise actuellement les tests Debian et les référentiels pourraient avoir changé entre-temps.

Braiam
la source
0

AFAIK, il a des valeurs par défaut pour satisfaire une dépendance, donc si cette dépendance n'a pas été satisfaite avant d'installer un package, il installe la dépendance puis installe le package demandé.

Cependant, cela pourrait également être un gros bogue.

Quoi qu'il en soit, j'espère que cela vous aidera.

haneefmubarak
la source