Как установить только зависимости пакета?

45

Запуск sudo apt-get install <PACKAGE>установит пакет, его зависимости и любые другие рекомендуемые пакеты.

Однако, похоже, нет способа установить только зависимости пакета и исключить сам пакет.

Как можно это сделать?

Натан Осман
источник
Просто любопытно, почему ты хочешь это сделать?
Крис Харпер
@ root45: Ну, это немного уникальная ситуация: у меня есть исходный код пакета Python в репозиториях. и это не начинается. Мне нужно установить зависимости для пакета без установки самого пакета (так как у меня уже есть код).
Натан Осман
1
Не могли бы вы просто выполнить пробную установку apt-get install и посмотреть, что будет установлено, а затем просто установить все, кроме приложения, которое вы компилируете?
Duffydack
2
Или просто установите его, а затем удалите приложение (но не его зависимости). И / или установите обновленный / исправленный пакет после его сборки.
января
Мне нужна возможность сделать это, чтобы я мог собрать и установить исходный пакет, который еще не создан для моей архитектуры. apt-get build-depустанавливает зависимости сборки, поэтому apt-get -b sourceработает, но зависимости времени выполнения не устанавливаются, поэтому происходит dpkg -i *.debсбой.
Тревор Робинсон

Ответы:

24

Это установит все пакеты в поле Depends и PreDepends :

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

В основном вы запрашиваете все зависимости, отфильтровываете (Pre) Depends и форматируете вывод для apt-get.

Одной из проблем являются такие зависимости, как

Depends: pulseaudio
  pulseaudio:i386

или виртуальные пакеты, такие как

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

Итак: используйте с осторожностью - это работает не во всех случаях!

htorque
источник
1
Есть много случаев, когда это не обрабатывается, например, это полностью сломает виртуальные пакеты (которые напечатаны в угловых скобках). Смотрите здесь для примеров: askubuntu.com/questions/25361/…
Тревор Робинсон
Спасибо за подсказку, хотя я не совсем уверен, как справиться со всеми этими проблемами. :-(
htorque
2
Если можно, я бы хотел предложить более простое решение с AWK:sudo apt-get install $(apt-cache depends PACKAGE-NAME-HERE | awk '$1~/Depends/{printf $2" "}')
Сергей Колодяжный
1
Я столкнулся с проблемой виртуального пакета, которую вы упомянули выше; обновление sedв трубопроводе к следующему работал для меня sed -e "s/.*ends:\ //" -e 's/<[^>]*>//'. В моем случае виртуальному пакету в < >предшествовал пакет, удовлетворяющий ему, поэтому удаление элемента в < >работало нормально.
Берто
5

apt-get build-dep <package> сделает свое дело.

Laudeci
источник
13
Это не сработает, потому что у пакета есть зависимости времени выполнения, с которыми он не будет установлен apt-get build-dep.
Натан Осман
5

Если вы не против копирования / прошлого, просто смоделируйте apt-get с установкой -s. Таким образом, вы увидите, какие другие пакеты будут установлены и / или обновлены, а затем просто удалите имя пакета, который вы не хотите устанавливать, из этого списка и вуаля.

sudo apt-get install -s <package>

bksunday
источник
4

Чтобы вывести список всех зависимостей данного пакета, который не устанавливается, вы можете использовать aptitude

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

Чтобы установить зависимости

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

Примеры

  • Перечислите зависимости

    % aptitude search '!~i?reverse-depends("^mc$")'
    p    mc-data         - Midnight Commander - a powerful file manager -- data files
    
  • Показать только название пакета

    % aptitude search '!~i?reverse-depends("^mc$")' -F "%p"
    mc-data                            
    
  • Установите зависимости для, например, 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
источник
1

Вы можете проанализировать выходные данные моделирования установки apt, чтобы сделать это, вот функция bash, чтобы сделать это для вас:

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
}

Использование:

apt-install-depends mopidy
trevorjay
источник
0

Чтобы установить только зависимости, вы можете использовать apt-cache show package | grep Depends. Это даст вам список зависимостей:

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)

тогда вы можете решить, какой пакет установить с помощью apt-get. Также есть aptitudeв интерактивном режиме, вы ищите пакет, выбираете его и затем устанавливаете его зависимости:

введите описание изображения здесь

Braiam
источник