Zignoruj ​​wszystkie zależności dla konkretnego pakietu za pomocą apt-get

16

To bardzo konkretne pytanie, na które Google nie pomogło odpowiedzieć.

Używam Ubuntu 13.04 z apt 0.9.7.7ubuntu4 for amd64 compiled on Oct 3 2013 15:25:56.

Chcę zainstalować Erlang z pakietu .deb, ale nie chcę wyciągać wszystkich jego zależności. Sam pakiet określa, że ​​zależy od bibliotek Java i wx, ale w rzeczywistości nie są one potrzebne, chyba że chcesz połączyć się z Javą lub wxWidgets.

Mogę zainstalować Erlang w ten sposób

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

Jednak instalacja czegokolwiek apt-getpóźniej nie powiedzie się z powodu niezaspokojonych zależności. Więc jeśli chcę zainstalować git po Erlangu, otrzymuję następujące informacje

$ 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).

Czy istnieje sposób na esl-erlangzamknięcie pakietu bez uruchamiania apt-get install -f?

Chcę coś takiego:

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

lub tak:

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

albo to:

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

Znalazłem podobne pytanie: /server/250224/how-do-i-get-apt-get-to-ignore-some-dependencies . Kilka odpowiedzi zawiera przydatne ręczne kroki, aby zmodyfikować zależności niektórych pakietów.

Nadal szukam solidnej zautomatyzowanej metody.

android
źródło
Próbowałeś --nodeps( apt-get) lub --ignore-dependsz dpkg?
Mike Koch

Odpowiedzi:

27

Rozumiem punkt bjanssena, ale wydaje się śmieszne, aby menedżer pakietów zezwolił --force-dependsna instalację pojedynczego pakietu, ale nie zezwalał na zależność od siły na zawsze i przestań ostrzegać mnie przed tą zależnością.

Miałem podobny problem z pakietem, który zależał od wersji libcairo nieco wyższej niż obecnie dostępna w Debianie. Dla moich celów nadal działa dobrze. Cieszę się, że mogę go używać, dopóki aktualizacja libcairo nie pojawi się w apt. Nie chcę kompilować ze źródła ani budować własnego pakietu.

Rozwiązanie, które znalazłem:

  • edytować /var/lib/dpkg/status,
  • znajdź pakiet z uszkodzonymi zależnościami
  • edytuj Depends:wiersz, aby zatrzymać reklamację pakietu.

Zakładam, że zostaną zastąpione przy następnej aktualizacji pakietu, ale właśnie tego chcę.

Andrew Lorien
źródło
2
Jest to idealne, właśnie to, czego potrzebowałem, aby tymczasowo obejść nieprawidłową zależność PPA!
Cas
2

To, co próbujesz zrobić, jest sprzeczne z celem menedżera pakietów, który stara się zachować rozsądne środowisko, ponieważ używasz niewłaściwego narzędzia do tego zadania. Nie próbuj przełamać apt-get.

Właściwym sposobem rozwiązania problemu jest zbudowanie własnego pakietu z zależnościami, które Ci odpowiadają. Istnieje oficjalny sposób (dość zaangażowany: http://www.debian.org/doc/manuals/maint-guide/index.en.html ) oraz szybki i brudny sposób użycia apt-buildlub w przypadku pakietów spoza źródła dystrybucji, checkinstall. Wszystkie pakiety produkcyjne apt-get zostaną zainstalowane z radością.

Na koniec możesz zakwestionować mądrość opiekuna esl-erlang, aby uwzględnić pewne zależności, ale nie możesz winić menedżera pakietów za zamierzone zachowanie. Jeśli uważasz, że te zależności są błędne, powinieneś zgłosić błąd w pakiecie.

Bjanssen
źródło
To, co powiedziałeś o „celu menedżera pakietów” jest w gruncie rzeczy prawdą, ale nie powinieneś też uogólniać. Chciałbym podać przykład: potrzebna jest jedna aplikacja libmng1. Ale libmng2zainstalowałem ORAZ dowiązanie symboliczne ustawione na libmng1.so. Działał jako zagrożenie, nigdy nie miał żadnych problemów. Ale apt-getzawsze narzekał na „niespełnione zależności”. Jest więc zdecydowanie dobry powód, aby znaleźć sposób na uciszenie umiejętności w tym zakresie. Od rzeczy zrobić pracę, to po prostu utrzymuje skarży rzeczy, które po prostu nie problem. Po prostu widzi problemy tam, gdzie ich nie ma. I to jest denerwujące.
składnia błąd
To ciekawa sytuacja. Myślę, że zainstalowałeś pakiet z repozytorium nie-dystrybucyjnego? W takim przypadku spójrz na equivs„wyciszenie” apt-get bez jego łamania.
bjanssen
Cóż, mogło tak być. Ale tak naprawdę nie było ... Po prostu zainstalowałem starszy pakiet z tej samej dystrybucji, więc pod względem Ubuntu byłem na 15.x, ale zainstalowałem libmng1 z 12.04 LTS.
składnia błąd
0

Sprawdź, czy „używany serwer proxy” apt.confjest właściwy (tzn. Zgodny z siecią). Powoduje to również takie problemy, ponieważ adresy URL byłyby nieosiągalne.

Zazwyczaj, jeśli używasz serwera proxy, /etc/apt/apt.confwyglądałoby to tak:

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
źródło