Ignorieren Sie mit apt-get alle Abhängigkeiten für ein bestimmtes Paket


16

Dies ist eine sehr spezielle Frage, die von Google nicht beantwortet werden konnte.

Ich verwende Ubuntu 13.04 mit apt 0.9.7.7ubuntu4 for amd64 compiled on Oct 3 2013 15:25:56.

Ich möchte Erlang aus einem .deb-Paket installieren, möchte jedoch nicht alle Abhängigkeiten ermitteln. Das Paket selbst gibt an, dass es von Java- und wx-Bibliotheken abhängt. In Wirklichkeit werden diese jedoch nur benötigt, wenn Sie eine Schnittstelle mit Java oder wxWidgets herstellen möchten.

Ich kann Erlang so installieren

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

Die anschließende Installation anderer apt-getKomponenten schlägt jedoch aufgrund nicht erfüllter Abhängigkeiten fehl. Wenn ich also git nach Erlang installieren möchte, erhalte ich Folgendes

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

Gibt es eine Möglichkeit, das esl-erlangPaket zum Schweigen zu bringen, ohne ausgeführt zu werden apt-get install -f?

Ich möchte so etwas:

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

oder so:

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

oder dieses:

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

Ich habe eine ähnliche Frage gefunden: /server/250224/how-do-i-get-apt-get-to-ignore-some-dependencies . Einige Antworten enthalten praktische manuelle Schritte zum Ändern der Abhängigkeiten bestimmter Pakete.

Ich bin immer noch auf der Suche nach einer robusten automatisierten Methode.


Hast du es versucht --nodeps( apt-get) oder --ignore-dependsmit dpkg?
Mike Koch

Antworten:


27

Ich verstehe den Punkt von bjanssen, aber es erscheint für einen Paketmanager lächerlich, --force-dependseine einzelne Paketinstallation zuzulassen , aber keine forceabhängige Ewigkeit-und-Stopp-Warnung-mich-über-diese-Abhängigkeit zuzulassen.

Ich hatte ein ähnliches Problem mit einem Paket, das von einer libcairo-Version abhing, die etwas höher war als die derzeit in Debian verfügbare. Für meine Zwecke funktioniert es immer noch gut. Ich benutze es gerne weiter, bis das libcairo-Update in apt erscheint. Ich möchte nicht aus dem Quellcode kompilieren oder mein eigenes Paket erstellen.

Die Lösung, die ich gefunden habe:

  • bearbeiten /var/lib/dpkg/status,
  • Finde das Paket mit den kaputten Abhängigkeiten
  • Bearbeiten Sie die Depends:Zeile, um zu verhindern, dass sich das Paket beschwert.

Ich gehe davon aus, dass dies beim nächsten Update des Pakets überschrieben wird, aber genau das möchte ich.


2
Das ist perfekt, genau das, was ich brauchte, um eine inkorrekte PPA-Abhängigkeit vorübergehend zu umgehen!
Cas

2

Was Sie versuchen, ist gegen den Zweck eines Paketmanagers, der versucht, eine vernünftige Umgebung aufrechtzuerhalten, wenn Sie das falsche Tool für den Job verwenden. Versuchen Sie nicht, apt-get zu brechen.

Der richtige Weg, um Ihr Problem zu lösen, besteht darin, ein eigenes Paket mit Abhängigkeiten zu erstellen, die zu Ihnen passen. Es gibt den offiziellen Weg (ziemlich kompliziert: http://www.debian.org/doc/manuals/maint-guide/index.en.html ) und den schnellen und schmutzigen Weg apt-build, Pakete zu verwenden oder für Pakete, die nicht in der Distributionsquelle enthalten sind, checkinstall. Alle Produktpakete von apt-get werden problemlos installiert.

Abschließend können Sie die Weisheit des Betreuers von esl-erlang in Frage stellen, bestimmte Abhängigkeiten einzuschließen, aber Sie können den Paketmanager nicht für das beabsichtigte Verhalten beschuldigen. Wenn Sie der Meinung sind, dass diese Abhängigkeiten falsch sind, sollten Sie einen Fehler mit dem Paket melden.


Was Sie über den "Zweck eines Paketmanagers" gesagt haben, ist grundsätzlich wahr, aber Sie sollten es auch nicht verallgemeinern. Ich möchte ein Beispiel geben: eine Anwendung benötigt libmng1. Aber ich hatte libmng2AND einen Symlink auf gesetzt libmng1.so. Arbeitete eine Bedrohung, hatte nie Probleme. apt-getBeschwert sich aber immer über "unerfüllte Abhängigkeiten". Es gibt also auf jeden Fall einen guten Grund, einen Weg zu finden, um die Eignung in dieser Hinsicht zum Schweigen zu bringen. Da Dinge tun Arbeit, hält es nur für Dinge beschweren , die einfach sind kein Problem. Es werden nur Probleme gesehen, bei denen es keine gibt. Und das nervt.
Syntaxfehler

Das ist eine merkwürdige Situation. Ich vermute, Sie haben ein Paket aus einem nicht verteilten Repository installiert. In einem solchen Fall schauen Sie equivsnach "Silencing" apt-get, ohne es zu brechen.
Bjanssen

Das hätte auch so sein können. Tatsächlich war es aber nicht ... Ich habe einfach das ältere Paket von derselben Distribution installiert , also war ich in Ubuntu auf 15.x, aber ich habe die libmng1 von 12.04 LTS installiert.
Syntaxfehler

0

Überprüfen Sie, ob der "verwendete Proxy" in der apt.conf(dh in Übereinstimmung mit Ihrem Netzwerk) richtig ist. Dies führt auch zu solchen Problemen, da URLs nicht erreichbar wären.

Wenn Sie einen Proxy verwenden, /etc/apt/apt.confsieht dieser normalerweise folgendermaßen aus:

Acquire::ftp::proxy "ftp://<user>:<password>@<ip>:<port>/";
Acquire::http::proxy "http://<user>:<password>@<ip>:<port>/";
Acquire::https::proxy "https://<user>:<password>@<ip>:<port>/";
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.