Как заставить apt-get игнорировать некоторые зависимости?

86

Как мне заставить apt-get игнорировать некоторые зависимости? Например, я хотел установить mailx, чтобы использовать его для отправки электронной почты из скриптов cron / инструментов генерации отчетов. Тем не менее, установка mailx также устанавливает exim4 и целую кучу зависимостей (у меня уже установлен Postfix), в котором я на самом деле не нуждаюсь и который, я думаю, mailx также может обойтись.

Как я игнорирую некоторые зависимости, но все еще использую apt-get, так как это хороший инструмент?

FrancisV
источник
как установлен постфикс? через пакет Debian? или вы установили постфикс из источника?
тушить
Да, Postfix был установлен из источника
FrancisV
3
Почтовый пакет Debian только «рекомендует» exim4, не требует его. Если вы не хотите устанавливать рекомендуемые пакеты, просто добавьте APT::Install-Recommends "false";в свой apt.conf.
Риф
Я нашел удовлетворительный ответ на этот вопрос на unix.stackexchange.com; unix.stackexchange.com/a/404449/23542
artfulrobot

Ответы:

45

Простое и удобное решение: просто укажите ненужные пакеты с дополнительными -после каждого из них.

Пример без -переключателя:

root@debian:~# apt-get install bsd-mailx 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  exim4-base exim4-config exim4-daemon-light liblockfile-bin liblockfile1
[...]

Пример использования переключателя, чтобы избежать установки exim4-base . Обратите внимание -на в конце:

root@debian:~# apt-get install bsd-mailx exim4-base-
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package 'exim4-base' is not installed, so not removed
The following extra packages will be installed:
  liblockfile-bin liblockfile1 ssmtp
[...]

Как видите, apt-getон больше не пытается установить exim4-baseпакет и не пытается установить его различные зависимости (и exim4-configт. Д.).

И если вы ошиблись и в exim4-baseконце концов нуждались в этой зависимости, вы можете сделать apt-get installэто позже!

Jealie
источник
5
Это лучший способ избежать установки какой-либо конкретной зависимости. Другие ответы либо избегают установки всех зависимостей, либо удаляют зависимости после их установки, либо предлагают утомительно редактировать пакеты.
Нил
1
Это было именно то, что мне было нужно! (установка gnupg2без того, pinentry-gtk2чтобы избежать X deps)
Lapo
Это действительно здорово, однако, в моем случае apt-get отказывается устанавливать пакет с «неудовлетворенными зависимостями» (который я указал, используя этот метод). В частности, пакет документации на 100 мегабайт, который мне безразличен.
Рольф
3
Работает только с необязательными зависимостями, а не с необходимыми. Rmessage Ошибка: Depends: xxx but it is not going to be installed. Вы можете пропустить все необязательные пакеты сapt-get install --no-install-recommends PACKAGE
koppor
Также не работает с виртуальными пакетами. Но см. Unix.stackexchange.com/a/404449/23542
artfulrobot
55

Вы можете изменить зависимости пакета deb следующим образом:

  1. Распакуйте deb: ar x golden-linux.deb(создаст три файла: debian-binary control.tar.gz data.tar.gz)
  2. Распаковать архив управления: tar xzf control.tar.gz(создаст: postinst postrm preinst prerm md5sums control)
  3. Исправить зависимости в control(используйте текстовый редактор)
  4. Repack control.tar.gz: tar --ignore-failed-read -cvzf control.tar.gz {post,pre}{inst,rm} md5sums control
  5. Repack deb: ar rcs newpackage.deb debian-binary control.tar.gz data.tar.gz(порядок важен! См. [Примечание])

[Примечание]: dpkg не сможет быстро прочитать метаданные пакета, если ему придется искать, где заканчивается раздел данных!

Янус Троелсен
источник
2
Хорошо, это решает мне особый случай зависимостей от "raring8" до "raring6", но ту же версию = (, большое спасибо
Felipe Alcacibar
1
Спасибо от меня тоже; Я должен был использовать это, потому что приложение требовалось, libmng1.so.1даже если оно отлично работало с символической ссылкой, установленной на libmng1.so.2. apt-getпросто не мог насадить и постоянно раздражать меня по поводу неудовлетворенных зависимостей (даже при установке чего-то совершенно не связанного!). Какая куча мусорной концепции.
синтаксическая ошибка
+1 Это сработало и для меня. Пакет gnome-settings-daemonхотел, gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11но у меня уже есть gnome-settings-daemon-schemas=3.8.6.1-0ubuntu11.2(<- обратите внимание на ".2" на конце). Эта процедура позволила мне отредактировать пакет и заставить его использовать более новую версию 11.2. БЛАГОДАРЮ ВАС!
Эрик Дункан
1
Отличное решение, спасибо. Я немного изменил шаги 2 и 4: 2. FILES=$(tar zxvf control.tar.gz)чтобы сохранить список файлов в переменной. 4. tar zcf control.tar.gz $FILES- создать архив за один шаг без каналов или перенаправлений, используя оригинальный список файлов (после модификации).
Бретт
2
Еще пара предложений. Для # 4: добавьте --ignore-failed-readтак, чтобы tarигнорировать отсутствующие файлы из остальной части командной строки. (Например, prerm, postrmотсутствуют многие пакеты.) Кроме того , тарболах может быть , .xzа не .gzв более новых версиях формата архива Debian (например data.tar.xz).
Дэн Ленски
33

После того, как вы установите пакет с --ignore-depends опцией, перейдите и отредактируйте /var/lib/dpkg/statusфайл и удалите все зависимости, которые, по вашему мнению, не нужны. Просто будь очень осторожен. В порядке деп. будет необходимо, это более чем вероятно BE требуется

Манолис
источник
3
После обновления /var/lib/dpkg/statusможет потребоваться завершить установку sudo apt-get -f install(указывать пакет не нужно).
Zmicier Zaleznicenka
Также найдено здесь: superuser.com/a/815371/127024 .
Иоганн
Это дает мне мурашки по коже, но это сработало безупречно!
Дэвид Шмитт
25

Вы можете попробовать --nodepsфлаг с apt-get.
Или загрузите пакет и установите его, используя dpkgопцию --ignore-depends.

Например, если вы хотите установить пакет fooбез зависимости bar:

dpkg --ignore-depends=bar -i foo_1.2.3_amd64.deb
Барт Де Вос
источник
52
Какая версия APT у вас есть? У моей ( 0.8.10 ) такой опции нет.
Чепанг
8
сказать dpkg игнорировать зависимости не подходит ему. Он только указывает dpkg игнорировать зависимости для ЭТОЙ транзакции, затем он попытается удовлетворить зависимости или удалить пакет в следующий раз, когда вы что-либо сделаете.
тушить
2
Все еще не повезло с APT 0.8.16 BTW. Жаль, потому что, кажется, нет разумных альтернатив. Какую версию вы использовали в 2011 году, чтобы заставить это работать?
Кристиан
2
вы можете использовать apt-get download и затем dpkg
Фредерик Рот
7
--no-install-recommendsработал на меня.
Олле Херстедт
14

Поскольку вы установили postfix из исходного кода, вам необходимо установить «фиктивный» пакет, который будет удовлетворять зависимости mailx transport-agent от mailx (или bsd-mailx). Пакет «эквивалент» в Debian существует для создания такого фиктивного пакета, который вы можете установить, чтобы сообщить dpkg «эта зависимость удовлетворена»

Причина, по которой указание dpkg просто игнорировать зависимости не является хорошим решением, заключается в том, что вы просто указываете dpkg / apt игнорировать его для одной транзакции, вы не можете сказать, что он игнорирует зависимости навсегда. Каждый раз, когда вы используете apt, он проверяет зависимости всех пакетов

тушеное мясо
источник
2
Смотрите также этот ответ, который ссылается на учебник (хотя он слишком сложный) superuser.com/a/416560/128960 . Краткая версия: запустить equivs-control <name>, отредактировать созданный файл, чтобы обеспечить правильную зависимость и иметь хорошее имя, затем запустить equivs-build <name>и, наконец, dpkg -iполучившийся файл .deb.
Кристиан
1
ИМХО это действительно самое хорошее решение. Все другие решения, запрошенные здесь, слишком хакерские. Это нужно сделать только один раз, и вы можете установить любое программное обеспечение, которое будет зависеть от самостоятельно скомпилированного программного обеспечения, так что ... Итак, давайте подтвердим этот ответ!
rugk
7

Я искал эту опцию на сервере Ubuntu 12.04 под управлением Xen. В своих доменах я использую ядро ​​-virtual и постоянно пытаюсь устанавливать grub при каждом обновлении пакета ядра. Однако Grub не нужен внутри DOMU при использовании p [yv] grub.

Я также искал опцию -nodeps для apt-get, но она не работала, поэтому в конечном итоге удалял / удалял grub * после каждого обновления ядра.

В конце концов, действительно полезно чтение man-страницы - оказывается, похожая опция apt-get на 12.04, похоже, --no-install-Recommended, которая на самом деле работает в этом случае, так как grub указан как 'рекомендуемый' в информация о пакете (наверное, это не «реальная» зависимость?).

Я добавляю это здесь, потому что в моем случае это решило подобную проблему, а подсказка для '--no-install-Recommended' еще не упоминалась.

memartin
источник
6

Вы можете скачать пакет с помощью apt-get, а затем установить его с помощью dpkg, вручную перечислив зависимость, которую вы хотели бы игнорировать.

Например, если я хочу загрузить mypackage, но это зависит от libperl5.14, и я не хочу устанавливать libperl5.14, так как у меня другая версия, я могу игнорировать эту зависимость следующим образом:

apt-get download mypackage
dpkg -i --ignore-depends=libperl5.14 mypackage.deb
A.Badger
источник
Просто упомянуть, что это сделает вас «сломанными». Это не позволит вам установить другие пакеты, пока вы не исправите отсутствующую зависимость.
drpexe
6

Альтернативный способ ручной настройки зависимостей:

apt-get download yourpackage
dpkg-deb -x yourpackage.deb PackageFolder
dpkg-deb --control yourpackage.deb PackageFolder/DEBIAN
vim PackageFolder/DEBIAN/control
dpkg -b PackageFolder yourpackage2.deb
apt-get install ./yourpackage2.deb
AndrewHarvey
источник
2

В моей системе Debian bsd-mailx фактически зависит от default-mta | mail-transport-agent(вы можете проверить, от чего зависит пакет, apt-cache show <pkg>для чего-либо в архиве или dpkg -s <pkg>для установленных пакетов.

Возможно, ваш постфиксный пакет не имеет, Provides: mail-transport-agentпоэтому apt не понимает, что у вас установлен MTA. Для этого стоит подать ошибку, если это официальный пакет.

Энди
источник
1

Для этого вы можете просто установить гвоздь, который, я думаю, не имеет этих зависимостей?

apt-get install nail
jamespo
источник
-5

Ну, не надо.

Использование работы других людей очень важно на пути к любому успеху. Когда вы создаете какое-то программное обеспечение из исходного кода (tarball), вы упускаете возможность использовать работу менеджера пакетов дистрибутива.

Вы не будете получать «бесплатные» обновления. В большинстве случаев никто не обновляет пакеты, которые они установили из исходного кода. Поскольку им нужно отслеживать программное обеспечение на наличие новых версий, перестраивайте его и все зависимые программы (постарайтесь запомнить их).

У вас будут проблемы с другими пакетами из репозитория вашего дистрибутива. Это как раз тот случай, который указан в вопросе: в Ubuntu есть отличный менеджер пакетов и несколько очень приятных людей, которые поддерживают пакеты. И они решили, что для работы программы mailx нужен MTA. Так что, если вы установили postfix из исходников, Ubuntu не попросит вас установить exim.

Если по какой-либо причине обслуживание сервера переходит к другому человеку (например, ваш проект становится очень успешным, и вы решаете нанять другого парня для управления серверами, пока вы заняты другими делами), он, естественно, будет ожидать, что он запустит dpkg --get-selectionsвсе установленные пакеты.

Старайтесь максимально использовать программное обеспечение для управления пакетами дистрибутива. Научитесь создавать свои собственные пакеты, если вы не можете найти один готовый пакет, и вы станете лучшим профессионалом.

skarap
источник