Как заставить apt-get игнорировать некоторые зависимости? Например, я хотел установить mailx поэтому я могу использовать его для отправки электронной почты из скриптов cron / инструментов создания отчетов. Однако установка mailx также устанавливает exim4 и целая куча зависимостей (у меня уже установлен Postfix), которые мне действительно не нужны, и я думаю, без которых mailx может жить.
Как мне игнорировать некоторые зависимости, но по-прежнему использовать apt-get, поскольку это хороший инструмент?
Простое и легкое решение: просто укажите ненужные пакеты с дополнительным -
после каждого из них.
Пример без -
переключатель:
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
это позже!
Вы можете изменить зависимости пакета deb следующим образом:
ar x golden-linux.deb
(создаст, например, три файла: debian-binary control.tar.gz data.tar.gz)tar xzf control.tar.gz
(создаст: postinst postrm preinst prerm md5sums control)control
(используйте текстовый редактор)tar --ignore-failed-read -cvzf control.tar.gz {post,pre}{inst,rm} md5sums control
ar rcs newpackage.deb debian-binary control.tar.gz data.tar.gz
(порядок важен! См. [Примечание])[Примечание]: dpkg не смог бы быстро прочитать метаданные пакета, если бы ему пришлось искать, где заканчивается раздел данных!
После установки пакета с --ignore-depends
вариант, перейдите и отредактируйте /var/lib/dpkg/status
file и удалите любую зависимость, которая, по вашему мнению, не нужна. Только будьте очень осторожны. Для того, чтобы зам. быть обязательным, это более чем вероятно БЫТЬ обязательный
Вы можете попробовать --nodeps
флаг с apt-get
.
Или загрузите пакет и установите его, используя dpkg
с возможностью --ignore-depends
.
Например, если вы хотите установить пакет foo
без зависимости bar
:
dpkg --ignore-depends=bar -i foo_1.2.3_amd64.deb
Поскольку вы установили postfix из исходного кода, вам необходимо установить «фиктивный» пакет, который будет удовлетворять зависимости mail-transport-agent от mailx (или bsd-mailx). Пакет "Equivs" в debian существует для создания такого фиктивного пакета, который вы можете установить, чтобы сообщить dpkg, что "эта зависимость удовлетворена"
Причина, по которой указание dpkg просто игнорировать зависимости не является хорошим решением, заключается в том, что вы указываете dpkg / apt игнорировать его только для одной транзакции, вы не можете указать ему игнорировать зависимости навсегда. Каждый раз, когда вы используете apt, он проверяет зависимости от все пакеты
Альтернативный способ вручную настроить зависимости:
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
Вы можете загрузить пакет с помощью apt-get, а затем установить его с помощью dpkg, вручную перечислив зависимость, которую вы хотели бы игнорировать.
Например, если я хочу загрузить свой пакет, но он зависит от libperl5.14, и я не хочу устанавливать libperl5.14, так как у меня другая версия, я могу игнорировать эту зависимость следующим образом:
apt-get download mypackage
dpkg -i --ignore-depends=libperl5.14 mypackage.deb
Я искал этот вариант на сервере Ubuntu 12.04 с Xen. В своих доменах я использую -virtual ядро, и apt постоянно пытался установить grub при каждом обновлении пакета ядра. Однако Grub не нужен внутри domU при использовании p [yv] grub.
Я тоже искал параметр -nodeps для apt-get, но он не работал, поэтому в конечном итоге после каждого обновления ядра приходилось удалять / очищать grub *.
В конце концов, действительно чтение справочная страница иногда помогает - оказывается, аналогичный параметр apt-get в 12.04 выглядит как --no-install-рекомендует, что действительно работает в этом случае, поскольку grub указан как `` рекомендованный '' в информации о пакете (я предполагаю так это не "настоящая" зависимость?).
Я добавляю это здесь, потому что в моем случае это решило аналогичную проблему, а подсказка для '--no-install-рекомендует' еще не упоминалась.
В моей системе debian bsd-mailx фактически зависит от default-mta | mail-transport-agent
(Вы можете проверить, от чего зависит пакет, с помощью apt-cache show <pkg>
для чего угодно в архиве или dpkg -s <pkg>
для установленных пакетов.
Возможно, в вашем пакете postfix нет Provides: mail-transport-agent
поэтому apt не понимает, что у вас установлен MTA. Было бы неплохо зарегистрировать ошибку, если это официальный пакет.
Для этого вы можете просто установить гвоздь который, я думаю, не имеет этих зависимостей?
apt-get install nail
Это одна из причин, по которой я разработал lansmtpd
. Он не очень отполирован, но сейчас я использую его без них. postfix
или exim4
установлены. (Со временем я отполирую его, чтобы было легче установить.)
Дополнительным преимуществом является то, что при такой настройке электронная почта от cron на всех машинах в локальной сети будет доставляться, даже если Интернет отключен.
Ну не надо.
Использование чужого труда очень важно на пути к успеху. Когда вы собираете какое-то программное обеспечение из исходного кода (tarball), вы упускаете возможность использовать работу диспетчера пакетов дистрибутива.
Вы не получите «бесплатных» обновлений. В большинстве случаев никто никогда не обновляет пакеты, которые они установили из исходного кода. Потому что им нужно отслеживать программное обеспечение на предмет появления новых версий, пересобирать его и все зависимые программы (постарайтесь их запомнить).
У вас будут проблемы с другими пакетами из репозиториев вашего дистрибутива. Это именно тот случай, о котором говорилось в вопросе: в ubuntu есть отличный менеджер пакетов и несколько очень хороших людей, поддерживающих пакеты. И они решили, что для работы программы mailx необходим MTA. Итак, если вы установили postfix из исходников, ubuntu не попросит вас установить exim.
Если по какой-то причине обслуживание сервера переходит к другому человеку (например, ваш проект становится очень успешным, и вы решаете нанять другого человека для управления серверами, пока вы заняты другими делами), он, естественно, будет ожидать запуска dpkg --get-selections
чтобы получить все установленные пакеты.
Старайтесь как можно чаще использовать программное обеспечение для управления пакетами дистрибутива. Научитесь создавать свои собственные пакеты, если вы не можете найти готовый, и вы станете лучшим профессионалом.