Jak zainstalować tylko zależności pakietu?

45

Uruchomienie sudo apt-get install <PACKAGE>spowoduje zainstalowanie pakietu, jego zależności i wszystkich innych zalecanych pakietów.

Jednak wydaje się, że nie ma sposobu, aby zainstalować tylko zależności pakietu i wykluczyć sam pakiet.

Jak można to zrobić?

Nathan Osman
źródło
Ciekawe, dlaczego chcesz to zrobić?
Kris Harper
@ root45: To trochę wyjątkowa sytuacja: mam kod źródłowy pakietu Pythona w repozytoriach. i to się nie zaczyna. Muszę zainstalować zależności dla pakietu bez instalowania samego pakietu (ponieważ mam już kod).
Nathan Osman
1
Czy nie możesz po prostu przeprowadzić suchej instalacji apt-get i spojrzeć na to, co zostanie zainstalowane, a następnie po prostu zainstalować wszystko oprócz aplikacji, którą kompilujesz?
duffydack
2
Lub po prostu zainstaluj, a następnie usuń aplikację (ale nie jej zależności). I / lub zainstaluj zaktualizowany / naprawiony pakiet po jego zbudowaniu.
JanC
Potrzebuję tego, aby móc to zrobić i zainstalować pakiet źródłowy, który nie został jeszcze zbudowany dla mojej architektury. apt-get build-depinstaluje zależności kompilacji, więc apt-get -b sourcedziała, ale zależności środowiska wykonawczego nie są instalowane, więc dpkg -i *.debkończy się niepowodzeniem.
Trevor Robinson

Odpowiedzi:

24

Spowoduje to zainstalowanie wszystkich pakietów w polu Depends i PreDepends pakietu :

sudo apt-get install $(apt-cache depends <PACKAGE> | grep Depends | sed "s/.*ends:\ //" | tr '\n' ' ')

Zasadniczo pytasz o wszystkie zależności, odfiltrowujesz (Pre) Depends i formatujesz dane wyjściowe dla apt-get.

Jednym z problemów są takie zależności

Depends: pulseaudio
  pulseaudio:i386

lub wirtualne pakiety, takie jak

Depends: <java6-runtime-headless>
  default-jre-headless
  openjdk-6-jre-headless

Więc: używaj ostrożnie - nie we wszystkich przypadkach!

htorque
źródło
1
Istnieje wiele przypadków, w których nie jest to obsługiwane, np. Całkowicie psuje się na pakietach wirtualnych (które są drukowane w nawiasach kątowych). Zobacz tutaj przykłady: askubuntu.com/questions/25361/...
Trevor Robinson
Dzięki za podpowiedź, choć nie jestem do końca pewien, jak sobie poradzić z tymi wszystkimi problemami. :-(
htorque
2
Jeśli mogę, chciałbym zasugerować prostsze rozwiązanie z AWK:sudo apt-get install $(apt-cache depends PACKAGE-NAME-HERE | awk '$1~/Depends/{printf $2" "}')
Sergiy Kolodyazhnyy
1
Natknąłem się na problem z pakietem wirtualnym, o którym wspomniałeś powyżej; aktualizacja sedw przygotowaniu do dalszej pracował dla mnie sed -e "s/.*ends:\ //" -e 's/<[^>]*>//'. W moim przypadku pakiet wirtualny w < >poprzedziło pakiet spełniający go, więc usunięcie elementu < >działało dobrze.
berto
5

apt-get build-dep <package> da rade.

Laudeci
źródło
13
To nie zadziała, ponieważ pakiet ma zależności środowiska wykonawczego, które nie zostaną zainstalowane apt-get build-dep.
Nathan Osman,
5

Jeśli nie przeszkadza ci kopiowanie / wklejanie, po prostu symuluj instalację apt-get -s. W ten sposób zobaczysz, które inne pakiety zostaną zainstalowane i / lub zaktualizowane, a następnie po prostu usuniesz nazwę pakietu, którego nie chcesz instalować z tej listy i voila.

sudo apt-get install -s <package>

bksunday
źródło
4

Aby wyświetlić listę wszystkich zależności, które nie są instalowane, można użyć aptitude

aptitude search '!~i?reverse-depends("^PACKAGE_NAME$")'

Aby zainstalować zależności

aptitude search '!~i?reverse-depends("^PACKAGE_NAME$")' -F "%p" | xargs sudo apt-get install

Przykłady

  • Wymień zależności

    % aptitude search '!~i?reverse-depends("^mc$")'
    p    mc-data         - Midnight Commander - a powerful file manager -- data files
    
  • Pokaż tylko nazwę pakietu

    % aptitude search '!~i?reverse-depends("^mc$")' -F "%p"
    mc-data                            
    
  • Zainstaluj zależności np mc

    % aptitude search '!~i?reverse-depends("^mc$")' -F "%p" | xargs sudo apt-get install     
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following NEW packages will be installed:
      mc-data
    0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
    Need to get 1.166 kB of archives.
    After this operation, 5.550 kB of additional disk space will be used.
    Get:1 http://archive.ubuntu.com/ubuntu/ wily/universe mc-data all 3:4.8.13-3 [1.166 kB]
    Fetched 1.166 kB in 0s (1.250 kB/s)
    Selecting previously unselected package mc-data.
    (Reading database ... 606748 files and directories currently installed.)
    Preparing to unpack .../mc-data_3%3a4.8.13-3_all.deb ...
    Unpacking mc-data (3:4.8.13-3) ...
    Processing triggers for doc-base (0.10.6) ...
    Processing 1 added doc-base file...
    Registering documents with scrollkeeper...
    Processing triggers for man-db (2.7.4-1) ...
    Processing triggers for hicolor-icon-theme (0.15-0ubuntu1) ...
    Setting up mc-data (3:4.8.13-3) ...
    
AB
źródło
1

Możesz przeanalizować dane wyjściowe symulacji apt install, aby to zrobić, oto funkcja bash, która to zrobi:

apt-install-depends() {
    local pkg="$1"
    apt-get install -s "$pkg" \
      | sed -n \
        -e "/^Inst $pkg /d" \
        -e 's/^Inst \([^ ]\+\) .*$/\1/p' \
      | xargs apt-get install
}

Stosowanie:

apt-install-depends mopidy
trevorjay
źródło
0

Aby zainstalować tylko zależności, możesz użyć apt-cache show package | grep Depends. To da ci listę zależności:

apt-cache show apache2 | grep Depends
Depends: apache2-mpm-worker (= 2.2.22-6ubuntu5.1) | apache2-mpm-prefork (= 2.2.22-6ubuntu5.1) | apache2-mpm-event (= 2.2.22-6ubuntu5.1) | apache2-mpm-itk (= 2.2.22-6ubuntu5.1), apache2.2-common (= 2.2.22-6ubuntu5.1)

następnie możesz zdecydować, który pakiet zainstalować za pomocą apt-get. Jest również aptitudew trybie interaktywnym, szukasz pakietu, wybierz go, a następnie zainstaluj jego zależności:

wprowadź opis zdjęcia tutaj

Braiam
źródło