web-dev-qa-db-fra.com

Façon correcte d'installer une dépendance virtuelle

Je suis en train de créer un package .deb de notre application basée sur Java (voir this-superuser-question ). J'utilise maintenant les informations de dépendance suivantes:

Depends: Java-runtime-headless (>= 1.6)
Recommends: openjdk-7-jre-headless, ...

Maintenant j'essaye de l'installer:

$ Sudo dpkg -i MYAPP.deb 
Selecting previously unselected package MYAPP.
(Reading database ... 140874 files and directories currently installed.)
Unpacking MYAPP (from MYAPP.deb) ...
dpkg: dependency problems prevent configuration of MYAPP:
 MYAPP depends on Java-runtime-headless (>= 1.6); however:
  Package Java-runtime-headless is not installed.
dpkg: error processing MYAPP (--install):
 dependency problems - leaving unconfigured
Processing triggers for desktop-file-utils ...
Processing triggers for bamfdaemon ...
Rebuilding /usr/share/applications/bamf.index...
Processing triggers for gnome-menus ...
Errors were encountered while processing:
 MYAPP
$

OK, j'essaye d'installer la dépendance:

$ Sudo apt-get install Java-runtime-headless
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package Java-runtime-headless is a virtual package provided by:
  openjdk-7-jre-headless 7u25-2.3.10-1ubuntu0.12.04.2
  openjdk-6-jre-headless 6b27-1.12.6-1ubuntu0.12.04.2
  gcj-jre-headless 4:4.6.3-1ubuntu5
  gcj-4.6-jre-headless 4.6.3-1ubuntu2
  default-jre-headless 1:1.6-43ubuntu2
You should explicitly select one to install.

E: Package 'Java-runtime-headless' has no installation candidate

OK, j'ai choisi l'un de ces packages:

$ Sudo apt-get install openjdk-7-jre-headless
Reading package lists... Done
Building dependency tree       
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
 openjdk-7-jre-headless : Depends: openjdk-7-jre-lib (= 7u25-2.3.10-1ubuntu0.12.04.2) but it is not going to be installed
                          Depends: ca-certificates-Java but it is not going to be installed
                          Depends: tzdata-Java (>= 2012e-0ubuntu0.12.04.1) but it is not going to be installed
                          Depends: Java-common (>= 0.28) but it is not going to be installed
                          Depends: libnss3-1d (>= 3.12.9+ckbi-1.82-0ubuntu4) but it is not going to be installed
                          Recommends: icedtea-7-jre-jamvm (= 7u25-2.3.10-1ubuntu0.12.04.2) but it is not going to be installed
 MYAPP : Depends: Java-runtime-headless (>= 1.6)
         Recommends: Mercurial but it is not going to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

Maintenant, il me propose seulement de supprimer mon application:

$ Sudo apt-get -f install
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Correcting dependencies... Done
The following packages will be REMOVED:
  MYAPP
0 upgraded, 0 newly installed, 1 to remove and 3 not upgraded.
1 not fully installed or removed.
After this operation, 41.0 MB disk space will be freed.
Do you want to continue [Y/n]? n
Abort.
$ 

Il semble que je commence par installer la dépendance (openjdk-7-jre-headless), puis mon application. Comment un utilisateur normal devrait-il comprendre cela? Ou existe-t-il un meilleur moyen d'installer MYAPP.deb?

6
Thomas S.

Je voudrais supprimer la version de votre dépendance "Java-runtime-headless".

Les paquets virtuels souffrent de limitations troublantes, la plus importante étant l’absence de numéro de version.

http://debian-handbook.info/browse/stable/sect.package-meta-information.html

Si vous souhaitez spécifier lequel des ensembles de packages réels doit être le package par défaut pour satisfaire une dépendance particulière à un package virtuel, vous devez répertorier le package réel en tant qu'alternative avant le package virtuel.

http://sdn.vlsm.org/share/Debian-Doc/debian-policy/ch-relationships.html

5
NGRhodes

Comme NGRhodes suggéré que j'ai changé les dépendances à

Depends: openjdk-7-jre-headless | Java-runtime-headless, ...
Recommends: ...

Maintenant je peux l'installer avec

$ Sudo dpkg -i MYAPP.deb

et installez les dépendances manquantes avec

$ Sudo apt-get -f install
2
Thomas S.

Alors, pourquoi avez-vous interrompu l'exécution de Sudo apt-get -f install. Exécutez-le à nouveau et n'abandonnez pas.

Après avoir exécuté ces commandes:

Sudo apt-get clean
Sudo apt-get autoclean
Sudo dpkg --configure -a

Puis relancez:

Sudo apt-get -f install

Si le résultat est quelque chose comme:

0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded

puis lancez:

Sudo apt-get -u dist-upgrade

Voir Comment résoudre les dépendances non résolues après l'ajout d'un PPA? pour plus d'informations.

Maintenant, installez Java-runtime-headless en utilisant la commande suivante:

Sudo apt-get install openjdk-7-jre-headless

Et enfin, installez votre application:

Sudo dpkg -i MYAPP.deb 
2
Radu Rădeanu