Dlaczego apt uważa, że ​​potrzebuje tej dodatkowej zależności?

9

Pracuję nad niektórymi instrukcjami konfiguracji komputera i byłem zaskoczony, gdy dowiedziałem się, że apt-get install A Bmoże zachowywać się inaczej niż apt-get install A && apt-get install B.

Moim konkretnym przykładem jest A == openjdk-7-jdki B == ant.

openjdk-7-jdkZależy więc od tego openjdk-7-jre-headless, co spełnia antzależność java6-runtime-headless. Ale jeśli zainstalujesz je jako apt-get install openjdk-7-jdk ant, APT nie wydaje się tego rozgryzać i instaluje default-jre-headless. Ale jeśli zainstalujesz openjdk-7-jdkprzed instalacją ant, jego zależność jest spełniona i wszystko jest w porządku.

APT jest zwykle wystarczająco inteligentny, aby coś takiego wymyślić, więc dlaczego nie może tego zrobić w tym przypadku? Chciałbym lepiej zrozumieć, dlaczego to działa w ten sposób, więc tego rodzaju rzeczy już mnie nie potkną w przyszłości.

leedm777
źródło
Patrząc na moją apt cache, widzę, że openjdk-7-jdk 7 ~ u3-2.1.1 ~ pre1-1ubuntu2 zależy od openjdk-7-jre, co z kolei zależy od openjdk-7-jre-headless, więc ta zależność jest pośrednia . mrówka zależy bezpośrednio od default-jre-headless. Używam Precise. Zgaduję tylko, ale apt-get może albo dowolnie zacząć od mrówki, albo zacząć od zależności na poziomie 1, a następnie przejść do zależności na poziomie 2. W każdym razie, jeśli zależy ci na ostatecznej konfiguracji pakietów (chcesz, aby openjdk-7-jre-headless zamiast domyślnie -..- ..), określenie ich konkretnie i indywidualnie jest prawdopodobnie najlepszym sposobem na kontrolowanie tego.
John S Gruber,
Czy nadal jesteś zainteresowany tym pytaniem?
guntbert
@ guntbert Pewnie, chociaż pogodziłem się z przekonaniem, że nie ma powodu; tak po prostu jest.
leedm777
5
Aby zobaczyć, jak działa resolver APT, spójrz na apt-get install -o Debug::pkgProblemResolver=true package1 package2.... To może dać ci wskazówkę, dlaczego tak działa.
Lasall

Odpowiedzi:

2

Wygląda na to, że istnieje tutaj jakiś system „wagi”:

$ 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

Jak widać, antzależy to od openjdk-7-jdkskomplikowanej i skomplikowanej ilości sugestii, zaleceń i zależności, podczas gdy korzystanie openjdk-6-jdkz zależności jest bardziej bezpośrednie:

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

Oczywiście aptitudemetody rozwiązywania zależności mogą być inne apt-get. BTW, uruchamianie symulacji mrówki bez zainstalowanego openjdk-7-jdk nie pociągnęło za sobą 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]? 

Może jeśli użyjesz tych samych metod, co ja, możesz dowiedzieć się więcej, ponieważ używam teraz testów Debiana, a repozytoria mogły się w międzyczasie zmienić.

Braiam
źródło
0

AFAIK, ma wartości domyślne dla spełnienia zależności, więc jeśli ta zależność nie została spełniona przed zainstalowaniem pakietu, instaluje zależność, a następnie instaluje żądany pakiet.

Może to jednak być po prostu duży błąd.

Tak czy inaczej, mam nadzieję, że to pomoże.

HananeMubarak
źródło