Игнорировать все зависимости для определенного пакета с помощью apt-get

16

Это очень специфический вопрос, на который не помог Google.

Я использую Ubuntu 13.04 с apt 0.9.7.7ubuntu4 for amd64 compiled on Oct 3 2013 15:25:56.

Я хочу установить Erlang из пакета .deb, но я не хочу извлекать все его зависимости. Сам пакет указывает, что он зависит от библиотек Java и wx, но в действительности они не нужны, если вы не хотите взаимодействовать с Java или wxWidgets.

Я могу установить Erlang, как это

sudo dpkg -i --force-depends erlang.deb

Тем не менее, установка чего-либо еще с apt-getпоследующим завершается неудачей из-за неудовлетворенных зависимостей. Поэтому, если я хочу установить git после Erlang, я получу следующее

$ sudo apt-get install -y git
Reading package lists...
Building dependency tree...
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
 esl-erlang : Depends: default-jre-headless but it is not going to be installed or
                       java2-runtime-headless or
                       java1-runtime-headless or
                       java2-runtime or
                       java1-runtime
              Depends: libwxbase2.8-0 but it is not going to be installed
              Depends: libwxgtk2.8-0 but it is not going to be installed
              Recommends: erlang-mode but it is not going to be installed
 git : Depends: libcurl3-gnutls (>= 7.16.2-1) but it is not going to be installed
       Depends: perl-modules but it is not going to be installed
       Depends: liberror-perl but it is not going to be installed
       Depends: git-man (> 1:1.7.9.5) but it is not going to be installed
       Depends: git-man (< 1:1.7.9.5-.) but it is not going to be installed
       Recommends: patch
       Recommends: rsync
       Recommends: ssh-client
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

Есть ли способ сделать esl-erlangпакет закрытым без запуска apt-get install -f?

Я хочу что-то вроде этого:

sudo apt-get install --ignore-deps-for-package=esl-erlang git

или вот так:

sudo apt-cache shut-package-up esl-erlang

или это:

sudo apt-get download git
sudo dpkg -i --with-deps git.deb

Я нашел похожий вопрос: /server/250224/how-do-i-get-apt-get-to-ignore-some-dependencies . Пара ответов предоставляет удобные шаги вручную для изменения зависимостей определенных пакетов.

Я все еще ищу надежный автоматизированный метод.

андроид
источник
Вы пробовали --nodeps( apt-get) или --ignore-dependsс dpkg?
Майк Кох

Ответы:

27

Я понимаю точку зрения bjanssen, но для менеджера пакетов кажется нелепым разрешать --force-dependsустановку одного пакета, но не разрешать принудительную зависимость-навсегда-и-остановить-предупреждение-меня-об-этой-зависимости.

У меня была похожая проблема с пакетом, который зависел от версии libcairo, немного более высокой, чем та, которая в настоящее время доступна в Debian. Для моих целей все еще работает нормально. Я рад продолжать использовать его, пока в apt не появится обновление libcairo. Я не хочу компилировать из исходного кода или создавать свой собственный пакет.

Решение, которое я нашел:

  • редактировать /var/lib/dpkg/status,
  • найти пакет с нарушенными зависимостями
  • отредактируйте Depends:строку, чтобы пакет не жаловался.

Я предполагаю, что это будет перезаписано при следующем обновлении пакета, но это именно то, что я хочу.

Эндрю Лориен
источник
2
Это прекрасно, как раз то, что мне нужно, чтобы временно обойти некорректную зависимость PPA!
Cas
2

То, что вы пытаетесь сделать, противоречит назначению менеджера пакетов, который старается поддерживать нормальную среду, т. Е. Вы используете не тот инструмент для этой работы. Не пытайся сломать apt-get.

Правильный способ решить вашу проблему - создать собственный пакет с зависимостями, которые вам подходят. Существует официальный способ (довольно сложный: http://www.debian.org/doc/manuals/maint-guide/index.en.html ) и быстрый и грязный способ использования apt-buildили для пакетов, не входящих в исходный код распространения, checkinstall, Все производимые пакеты apt-get будут с радостью установлены.

И последнее замечание: вы можете поставить под сомнение целесообразность сопровождения esl-erlang включить некоторые зависимости, но вы не можете обвинить менеджер пакетов в предполагаемом поведении. Если вы считаете, что эти зависимости неверны, вы должны сообщить об ошибке в пакет.

bjanssen
источник
То, что вы сказали о «назначении менеджера пакетов», в основном верно, но вам также не следует обобщать. Я хотел бы привести пример: нужно одно приложение libmng1. Но я libmng2установил И символическую ссылку на libmng1.so. Сработала угроза, никогда не было проблем. Но apt-getвсегда жаловался на «неудовлетворенные зависимости». Так что, безусловно, есть веская причина пытаться найти способ заставить замолчать способности в этом отношении. Так как вещи делают работу, он просто продолжает жаловаться на то , что просто не имеют никаких проблем. Он просто видит проблемы там, где их нет. И это раздражает.
синтаксическая ошибка
Это любопытная ситуация. Я полагаю, вы установили пакет из репозитория без распространения? В таком случае обратите внимание на equivs«молчание» apt-get, не нарушая его.
bjanssen
Ну, это могло быть так. Но на самом деле это не так ... Я просто установил более старый пакет из того же дистрибутива, поэтому в терминах Ubuntu я был на 15.x, но я установил libmng1 от 12.04 LTS.
syntaxerror
0

Проверьте, apt.confправильно ли используется используемый прокси-сервер (т. Е. Соответствует вашей сети). Это также вызывает такие проблемы, поскольку URL-адреса будут недоступны.

Как правило, если вы используете прокси, то ваш /etc/apt/apt.confбудет выглядеть так:

Acquire::ftp::proxy "ftp://<user>:<password>@<ip>:<port>/";
Acquire::http::proxy "http://<user>:<password>@<ip>:<port>/";
Acquire::https::proxy "https://<user>:<password>@<ip>:<port>/";
parasrish
источник