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