Почему apt считает, что ему нужна эта дополнительная зависимость?

9

Я работаю над некоторыми инструкциями по настройке машины, и я был удивлен, обнаружив, что 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 обычно достаточно умен, чтобы понять такие вещи, так почему же он не может сделать это в этом случае? Я хотел бы иметь лучшее понимание того, почему это работает таким образом, так что подобные вещи больше меня не сбивают с толку в будущем.

leedm777
источник
Глядя на мой кэш apt, я вижу, что openjdk-7-jdk 7 ~ u3-2.1.1 ~ pre1-1ubuntu2 зависит от openjdk-7-jre, что, в свою очередь, зависит от openjdk-7-jre-headless, поэтому эта зависимость является косвенной , Муравей напрямую зависит от default-jre-headless. Я использую Precise. Я только догадываюсь, что apt-get может либо произвольно начинаться с ant, либо начинаться с зависимостей уровня 1, а затем переходить к зависимостям уровня 2. В любом случае, если вы заботитесь об окончательной конфигурации пакетов (хотите, чтобы openjdk-7-jre-headless over default -..- ..), указав их специально и индивидуально, вероятно, лучший способ контролировать это.
Джон С. Грубер
Вы все еще заинтересованы в этом вопросе?
Гюнтберт,
@ Guntbert Конечно, хотя я смирился с убеждением, что нет никаких оснований; это просто так оно и есть.
leedm777
5
Чтобы увидеть, как работает распознаватель APT, посмотрите на apt-get install -o Debug::pkgProblemResolver=true package1 package2.... Это может дать вам подсказку, почему так работает.
Lasall

Ответы:

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

Как видите, 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. Кстати, симуляция ant без установленного openjdk-7-jdk не тянет 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, и за это время хранилища могли измениться.

Braiam
источник
0

AFAIK, он имеет значения по умолчанию для удовлетворения зависимости, поэтому, если эта зависимость не была удовлетворена до установки пакета, он устанавливает зависимость, а затем устанавливает запрошенный пакет.

Это также может быть большой ошибкой.

В любом случае, надеюсь, это поможет.

haneefmubarak
источник