web-dev-qa-db-fra.com

Y a-t-il une différence entre télécharger / installer une liste de packages et télécharger chaque package par ses propres moyens?

Étant donné une liste de packages de développement (par exemple pkgs = "python3.5-dev python3-tk"), y aurait-il une différence entre l'exécution

Sudo apt-get install $pkgs 

vs.

for p in $pkgs; do Sudo apt-get install $p; done

Je demande surtout dependencies-topo-sort lié, c'est-à-dire qu'il y aura différents packages téléchargés et installés dans les deux sens

11
CIsForCookies

Oui, différents packages peuvent être sélectionnés pour satisfaire les dépendances. Exécution d'une commande qui spécifie [~ # ~] n [~ # ~] les packages à installer auront parfois un effet différent de l'exécution des commandes [~ # ~] n [~ # ~] , chacune spécifiant 1 package à être installé, même lorsque les packages réels spécifiés sont les mêmes dans chaque cas.

La principale différence pratique est probablement celle que Karel a décrite . Cependant , les effets peuvent différer même lorsque toutes les opérations réussissent, en raison d'une résolution de dépendance différente.

La raison en est que vous avez largement supposé:

Je demande surtout les dépendances-topo-sort liées

Plus précisément, cela se produit car il peut y avoir plus d'une alternative qui satisfait une dépendance.

Explication abstraite

Supposons que vous souhaitiez installer le package a, qui dépend d'un package virtuelv et v peuvent être satisfaits par le package b ou package c et en aucun cas. Supposons que b ne dépend pas de c, c ne dépend pas de b, et aucun de ces packages n'est déjà installé. Supposons maintenant que vous exécutez:

Sudo apt-get install a

Alors APT sélectionnera b ou c pour satisfaire la dépendance. Celui qu'il choisit est le résultat d'un calcul qu'il effectue qui peut être affecté par quels packages vous avez installés, quels packages sont disponibles, quelle version de APT vous êtes en utilisant, et comment il est configuré. Mais quand toutes ces conditions sont les mêmes, la décision sera prise la même à chaque fois.

Supposons sans perte de généralité qu'il sélectionne b. Ensuite a et b sont installés. Supposons que vous exécutiez ensuite:

Sudo apt-get install c

Après cela, a, b et c sont tous installés. Autrement dit, les trois packages ont été installés à la suite de l'exécution:

Sudo apt-get install a
Sudo apt-get install c

En revanche , supposons que vous deviez exécuter cette commande à la place de celles-ci:

Sudo apt-get install ac

Ensuite, puisque a la dépendance de v est satisfaite par c, b n'est pas installé. Autrement dit, seulement a et c, mais pas b, sont installés à la suite de l'exécution:

Sudo apt-get install ac

Exemple concret

Vous pouvez trouver des exemples concrets de cela en exécutant apt ou apt-get Avec l'option -s, Ce qui le fait simuler votre action plutôt que de l'exécuter. (N'oubliez pas que vous ne pouvez pas les confirmer entièrement avec simplement apt-get -s/apt -s, Car les commandes antérieures apt-get -s/apt -s N'affectent pas les commandes ultérieures, car elles le font n'affecte rien, car ce ne sont que des simulations.)

L'exécution de Sudo apt-get install jedit Sur mon système Ubuntu 16.04 LTS installerait plusieurs packages OpenJDK 8:

ek@Io:~$ apt -s install jedit
NOTE: This is only a simulation!
      apt-get needs root privileges for real execution.
      Keep also in mind that locking is deactivated,
      so don't depend on the relevance to the real current situation!
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  ca-certificates-Java default-jre default-jre-headless Java-common Java-wrappers openjdk-8-jre openjdk-8-jre-headless
Suggested packages:
  default-Java-plugin icedtea-8-plugin fonts-wqy-zenhei fonts-indic
The following NEW packages will be installed:
  ca-certificates-Java default-jre default-jre-headless Java-common Java-wrappers jedit openjdk-8-jre
  openjdk-8-jre-headless
0 upgraded, 8 newly installed, 0 to remove and 11 not upgraded.
Inst Java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Inst ca-certificates-Java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all]) []
Inst Java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all]) []
Inst openjdk-8-jre-headless (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [AMD64])
Inst default-jre-headless (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [AMD64])
Inst openjdk-8-jre (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [AMD64])
Inst default-jre (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [AMD64])
Inst jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])
Conf Java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Conf Java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all])
Conf ca-certificates-Java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all])
Conf openjdk-8-jre-headless (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [AMD64])
Conf default-jre-headless (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [AMD64])
Conf openjdk-8-jre (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [AMD64])
Conf default-jre (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [AMD64])
Conf jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])

Si je demandais à APT d'installer à la fois jedit et openjdk-9-jre En exécutant Sudo apt-get install jedit openjdk-9-jre, Alors il n'installerait pas les packages OpenJDK 8, car La dépendance de jedit à un Java est satisfait par les packages OpenJDK 9:

ek@Io:~$ apt -s install jedit openjdk-9-jre
NOTE: This is only a simulation!
      apt-get needs root privileges for real execution.
      Keep also in mind that locking is deactivated,
      so don't depend on the relevance to the real current situation!
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  ca-certificates-Java java-common Java-wrappers libatk-wrapper-Java libatk-wrapper-Java-jni openjdk-9-jre-headless
Suggested packages:
  default-jre icedtea-8-plugin fonts-indic
The following NEW packages will be installed:
  ca-certificates-Java java-common Java-wrappers jedit libatk-wrapper-Java libatk-wrapper-Java-jni openjdk-9-jre
  openjdk-9-jre-headless
0 upgraded, 8 newly installed, 0 to remove and 11 not upgraded.
Inst Java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Inst ca-certificates-Java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all]) []
Inst Java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all]) []
Inst openjdk-9-jre-headless (9~b114-0ubuntu1 Ubuntu:16.04/xenial [AMD64])
Inst libatk-wrapper-Java (0.33.3-6 Ubuntu:16.04/xenial [all])
Inst libatk-wrapper-Java-jni (0.33.3-6 Ubuntu:16.04/xenial [AMD64])
Inst openjdk-9-jre (9~b114-0ubuntu1 Ubuntu:16.04/xenial [AMD64])
Inst jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])
Conf Java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Conf Java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all])
Conf ca-certificates-Java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all])
Conf openjdk-9-jre-headless (9~b114-0ubuntu1 Ubuntu:16.04/xenial [AMD64])
Conf libatk-wrapper-Java (0.33.3-6 Ubuntu:16.04/xenial [all])
Conf libatk-wrapper-Java-jni (0.33.3-6 Ubuntu:16.04/xenial [AMD64])
Conf openjdk-9-jre (9~b114-0ubuntu1 Ubuntu:16.04/xenial [AMD64])
Conf jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])

Si j'installais jedit et openjdk-9-jre Avec deux commandes Sudo apt-get install Distinctes, émises dans cet ordre, j'obtiendrais les packages OpenJDK 8 et OpenJDK 9.

16
Eliah Kagan

Si même un package d'une très longue liste de packages ne peut pas être installé, alors l'exécution de la commande s'arrêtera et il affichera un message d'erreur informatif. Il peut également être frustrant d'installer une longue liste de packages en un seul lot car certains packages nécessitent une entrée utilisateur interactive dans le terminal pour être installés avec succès. Si vous faites une erreur dans l'entrée utilisateur, vous devrez redémarrer tout le processus d'installation depuis le début.

Il est difficile d'obtenir l'exécution réussie de la commande jusqu'à la fin, sauf si vous divisez la longue liste initiale de packages en groupes de 25 à 40 packages, puis installez les packages avec apt un groupe à la fois. Cela ne prend pas beaucoup de temps supplémentaire et facilite l'installation de tous les packages.

N'oubliez pas une chose. Sudo apt install verrouille le répertoire administratif (/var/lib/dpkg/) lorsqu'il est en cours d'exécution, ne lancez donc aucun autre processus nécessitant des privilèges root tant que le processus d'apt n'a pas complètement terminé. Par exemple, si vous installez des packages avec apt à partir du terminal, n'essayez pas d'installer d'autres packages snap à partir du terminal dans un nouvel onglet ou une nouvelle fenêtre avant la fin du traitement d'apt.

8
karel