Ignorez toutes les dépendances pour un package spécifique avec apt-get


16

Il s'agit d'une question très spécifique à laquelle Google n'a pas aidé à répondre.

J'utilise Ubuntu 13.04 avec apt 0.9.7.7ubuntu4 for amd64 compiled on Oct 3 2013 15:25:56.

Je veux installer Erlang à partir d'un package .deb, mais je ne veux pas extraire toutes ses dépendances. Le package lui-même spécifie qu'il dépend des bibliothèques Java et wx, mais en réalité celles-ci ne sont pas nécessaires à moins que vous ne vouliez interfacer avec Java ou wxWidgets.

Je peux installer Erlang comme ça

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

Cependant, l'installation de toute autre chose avec apt-getaprès échoue en raison de dépendances non satisfaites. Donc, si je veux installer git après Erlang, j'obtiens ce qui suit

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

Existe-t-il un moyen de esl-erlangfermer un package sans l'exécuter apt-get install -f?

Je veux quelque chose comme ça:

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

ou comme ça:

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

ou ca:

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

J'ai trouvé une question similaire: /server/250224/how-do-i-get-apt-get-to-ignore-some-dependencies . Quelques réponses fournissent des étapes manuelles pratiques pour modifier les dépendances de certains packages.

Je suis toujours à la recherche d'une méthode automatisée robuste.


Avez-vous essayé --nodeps( apt-get) ou --ignore-dependsavec dpkg?
Mike Koch

Réponses:


27

Je comprends le point de bjanssen, mais il semble ridicule qu'un gestionnaire de paquets autorise --force-dependsune seule installation de paquet, mais ne permette pas que force-depend-forever-and-stop-warning-me-about-this-dependency.

J'ai eu un problème similaire avec un paquet qui dépendait d'une version de libcairo légèrement supérieure à celle actuellement disponible dans Debian. Pour mes besoins, cela fonctionne toujours bien. Je suis heureux de continuer à l'utiliser jusqu'à ce que la mise à jour de libcairo apparaisse dans apt. Je ne veux pas compiler à partir des sources ou créer mon propre package.

La solution que j'ai trouvée:

  • éditer /var/lib/dpkg/status,
  • trouver le package avec les dépendances cassées
  • modifiez la Depends:ligne pour empêcher le package de se plaindre.

Je suppose que ce sera écrasé la prochaine fois que le package sera mis à jour, mais c'est exactement ce que je veux.


2
C'est parfait, juste ce dont j'avais besoin pour contourner temporairement une dépendance PPA incorrecte!
Cas

2

Ce que vous essayez de faire est contraire au but d'un gestionnaire de paquets, qui essaie de garder un environnement sain, si vous utilisez le mauvais outil pour le travail. N'essayez pas de casser apt-get.

La bonne façon de résoudre votre problème est de créer votre propre package avec les dépendances qui vous conviennent. Il y a la manière officielle (assez impliquée: http://www.debian.org/doc/manuals/maint-guide/index.en.html ) et la manière rapide et sale d'utiliser apt-build, ou pour les paquets qui ne sont pas dans la source de distribution, checkinstall. Tous les packages de produits apt-get seront installés avec plaisir.

Sur une note finale, vous pouvez remettre en question la sagesse du responsable de esl-erlang pour inclure certaines dépendances, mais vous ne pouvez pas reprocher au gestionnaire de packages le comportement prévu. Si vous pensez que ces dépendances sont incorrectes, vous devez signaler un bogue avec le package.


Ce que vous avez dit au sujet du «but d'un gestionnaire de paquets» est fondamentalement vrai, mais vous ne devriez pas non plus généraliser. Je voudrais donner un exemple: une seule application nécessaire libmng1. Mais j'avais libmng2installé ET un lien symbolique réglé sur libmng1.so. A fonctionné une menace, n'a jamais eu de problèmes. Mais se apt-getplaignait toujours de «dépendances non satisfaites». Il y a donc certainement une bonne raison d'essayer de trouver un moyen de faire taire les aptitudes à cet égard. Depuis les choses font le travail, il ne cesse se plaindre des choses qui simplement ne sont pas un problème. Il voit juste les problèmes là où ils n'en sont pas. Et c'est ennuyeux.
erreur de syntaxe

C'est une situation curieuse. Je suppose que vous avez installé un package à partir d'un référentiel de non-distribution? Dans un tel cas, jetez un œil à equivsapt-get de "silence" sans le casser.
bjanssen

Eh bien, ça aurait pu être comme ça. Mais en fait ce n'était pas ... J'ai simplement installé l' ancien paquet à partir de la même distribution, donc en termes Ubuntu j'étais sur 15.x, mais j'ai installé la libmng1 à partir de 12.04 LTS.
syntaxerror

0

Vérifiez si le "proxy utilisé" apt.confest correct (c'est-à-dire conforme à votre réseau). Cela provoque également de tels problèmes, car les URL seraient inaccessibles.

En règle générale, si vous utilisez un proxy, votre /etc/apt/apt.confressemblerait à:

Acquire::ftp::proxy "ftp://<user>:<password>@<ip>:<port>/";
Acquire::http::proxy "http://<user>:<password>@<ip>:<port>/";
Acquire::https::proxy "https://<user>:<password>@<ip>:<port>/";
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.