Suivant: , Précédent: , Monter: Gestion de paquets   [Table des matières][Index]


4.2 Invoquer guix package

La commande guix package est l’outil qui permet d’installer, mettre à jour et supprimer les paquets ainsi que de revenir à une configuration précédente. Elle n’opère que dans le profil de l’utilisateur et fonctionne avec les privilèges utilisateurs normaux (voir Fonctionnalités). Sa syntaxe est :

guix package options

options spécifie d’abord les opérations à effectuer pendant la transaction. À la fin, une nouvelle génération du profil est créée mais les générations précédentes du profil restent disponibles si l’utilisateur souhaite y revenir.

Par exemple, pour supprimer lua et installer guile et guile-cairo en une seule transaction :

guix package -r lua -i guile guile-cairo

Parce que c’est pratique, nous fournissons aussi les alias suivants :

Ces alias sont moins expressifs que guix package et fournissent moins d’options, donc dans certains cas vous devrez probablement utiliser guix package directement.

guix package supporte aussi une approche déclarative où l’utilisateur spécifie l’ensemble exact des paquets qui doivent être disponibles le passe via l’option --manifest (voir --manifest).

Pour chaque utilisateur, un lien symbolique vers le profil par défaut de cet utilisateur est automatiquement créé dans $HOME/.guix-profile. Ce lien symbolique pointe toujours vers la génération actuelle du profil par défaut de l’utilisateur. Ainsi, les utilisateurs peuvent ajouter $HOME/.guix-profile/bin à leur variable d’environnement PATH etc. Si vous n’utilisez pas la distribution système Guix, vous devriez ajouter les lignes suivantes à votre ~/.bash_profile (voir Bash Startup Files dans The GNU Bash Reference Manual) pour que les shells créés ensuite aient tous les bonnes définitions des variables d’environnement :

GUIX_PROFILE="$HOME/.guix-profile" ; \
source "$HOME/.guix-profile/etc/profile"

Dans un environnement multi-utilisateur, les profils utilisateurs sont stockés comme une racine du ramasse-miettes, vers laquelle pointe $HOME/.guix-profile (voir Invoquer guix gc). Ce répertoire est normalement localstatedir/guix/profiles/per-user/utilisateur, où localstatedir est la valeur passée à configure avec --localstatedir et utilisateur le nom d’utilisateur. Le répertoire per-user est créé lorsque guix-daemon est démarré et le sous-répertoire user est créé par guix package.

Les options peuvent être les suivante :

--install=paquet
-i paquet

Installer les paquets spécifiés.

Chaque paquet peut spécifier soit un simple nom de paquet, comme guile ou un nom de paquet suivi d’un arobase et d’un numéro de version, comme guile@1.8.8 ou simplement guile@1.8 (dans ce dernier cas, la version la plus récente commençant par 1.8 est utilisée).

Si aucun numéro de version n’est spécifié, la version la plus récente disponible est choisie. En plus, paquet peut contenir un deux-points, suivi du nom d’une des sorties du paquet, comme dans gcc:doc ou binutils@2.22:lib (voir Des paquets avec plusieurs résultats). Des paquets avec un nom correspondant et (éventuellement une version) sont recherchés dans les modules de la distribution GNU (voir Modules de paquets).

Parfois les paquets ont des entrées propagées : ce sont des dépendances qui sont installées automatiquement avec le paquet demandé (voir propagated-inputs in package objects pour plus d’informations sur les entrées propagées dans les définitions des paquets).

Un exemple est la bibliothèque MPC de GNU : ses fichiers d’en-tête C se réfèrent à ceux de la bibliothèque MPFR de GNU, qui se réfèrent en retour à ceux de la bibliothèque GMP. Ainsi, lorsqu’on installe MPC, les bibliothèques MPFR et GMP sont aussi installées dans le profil ; supprimer MPC supprimera aussi MPFR et GMP — à moins qu’ils n’aient été aussi installés explicitement par l’utilisateur.

D’autre part, les paquets dépendent parfois de la définition de variables d’environnement pour leur chemin de recherche (voir les explications sur --search-paths plus bas). Toute définition de variable d’environnement manquante ou possiblement incorrecte est rapportée ici.

--install-from-expression=exp
-e exp

Installer le paquet évalué par exp

exp doit être une expression Scheme qui s’évalue en un objet <package>. Cette option est notamment utile pour distinguer les variantes d’un paquet avec le même nom, avec des expressions comme (@ (gnu packages base) guile-final).

Remarquez que cette option installe la première sortie du paquet, ce qui peut être insuffisant lorsque vous avez besoin d’une sortie spécifique d’un paquet à plusieurs sorties.

--install-from-file=fichier
-f fichier

Installer le paquet évalué par le code dans le fichier.

Par exemple, fichier peut contenir une définition comme celle-ci (voir Définition des paquets) :

(use-modules (guix)
             (guix build-system gnu)
             (guix licenses))

(package
  (name "hello")
  (version "2.10")
  (source (origin
            (method url-fetch)
            (uri (string-append "mirror://gnu/hello/hello-" version
                                ".tar.gz"))
            (sha256
             (base32
              "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
  (build-system gnu-build-system)
  (synopsis "Hello, GNU world: An example GNU package")
  (description "Guess what GNU Hello prints!")
  (home-page "http://www.gnu.org/software/hello/")
  (license gpl3+))

Les développeurs peuvent trouver utile d’inclure un tel fichier guix.scm à la racine de l’arborescence des sources de leur projet qui pourrait être utilisé pour tester des versions de développement et créer des environnements de développement reproductibles (voir Invoquer guix environment).

--remove=paquet
-r paquet

Supprimer les paquets spécifiés.

Comme pour --install, chaque paquet peut spécifier un numéro de version ou un nom de sortie en plus du nom du paquet. Par exemple, -r glibc:debug supprimerait la sortie debug de glibc.

--upgrade[=regexp …]
-u [regexp …]

Mettre à jour tous les paquets installés. Si une regexp ou plus est spécifiée, la mise à jour n’installera que les paquets dont le nom correspond à regexp. Voyez aussi l’option --do-not-upgrade en dessous.

Remarquez que cela met à jour vers la dernière version des paquets trouvée dans la distribution actuellement installée. Pour mettre à jour votre distribution, vous devriez lancer régulièrement guix pull (voir Invoquer guix pull).

--do-not-upgrade[=regexp …]

Lorsqu’elle est utilisée avec l’option --upgrade, ne pas mettre à jour les paquets dont le nom correspond à regexp. Par exemple, pour mettre à jour tous les paquets du profil actuel à l’exception de ceux qui contiennent la chaîne « emacs » :

$ guix package --upgrade . --do-not-upgrade emacs
--manifest=fichier
-m fichier

Créer une nouvelle génération du profil depuis l’objet manifeste renvoyé par le code Scheme dans fichier.

Cela vous permet de déclarer le contenu du profil plutôt que de le construire avec une série de --install et de commandes similaires. L’avantage étant que le fichier peut être placé sous contrôle de version, copié vers d’autres machines pour reproduire le même profil, etc.

fichier doit retourner un objet manifest qui est en gros une liste de paquets :

(use-package-modules guile emacs)

(packages->manifest
 (list emacs
       guile-2.0
       ;; Utiliser une sortie spécifique d'un paquet.
       (list guile-2.0 "debug")))

Dans cet exemple on doit savoir quels modules définissent les variables emacs et guile-2.0 pour fournir la bonne ligne use-package-modules ce qui peut être embêtant. On peut à la place fournir des spécifications de paquets normales et laisser specifications->manifest rechercher les objets de paquets correspondants, comme ceci :

(specifications->manifest
 '("emacs" "guile@2.2" "guile@2.2:debug"))
--roll-back

Revenir à la génération précédente du profil c.-à-d. défaire la dernière transaction.

Lorsqu’elle est combinée avec des options comme --install, cette option revient en arrière avant toute autre action.

Lorsque vous revenez de la première génération qui contient des fichiers, le profil pointera vers la zéroième génération qui ne contient aucun fichier en dehors de ses propres métadonnées.

Après être revenu en arrière, l’installation, la suppression et la mise à jour de paquets réécrit les futures générations précédentes. Ainsi, l’historique des générations dans un profil est toujours linéaire.

--switch-generation=motif
-S motif

Basculer vers une génération particulière définie par le motif.

Le motif peut être soit un numéro de génération soit un nombre précédé de « + » ou « - ». Ce dernier signifie : se déplacer en avant ou en arrière d’un nombre donné de générations. Par exemple, si vous voulez retourner à la dernière génération après --roll-back, utilisez --switch-generation=+1.

La différence entre --roll-back et --switch-generation=-1 est que --switch-generation ne vous amènera pas à la zéroième génération, donc si la génération demandée n’existe pas la génération actuelle ne changera pas.

--search-paths[=genre]

Rapporter les définitions des variables d’environnement dans la syntaxe Bash qui peuvent être requises pour utiliser l’ensemble des paquets installés. Ces variables d’environnement sont utilisées pour spécifier les chemins de recherche de fichiers utilisés par les paquets installés.

Par exemple, GCC a besoin des variables d’environnement CPATH et LIBRARY_PATH pour trouver les en-têtes et les bibliothèques dans le profil de l’utilisateur (voir Environment Variables dans Using the GNU Compiler Collection (GCC)). Si GCC et, disons, la bibliothèque C sont installés dans le profil, alors --search-paths suggérera d’initialiser ces variables à profil/include et profil/lib, respectivement.

Le cas d’utilisation typique est de définir ces variables d’environnement dans le shell :

$ eval `guix package --search-paths`

genre peut être l’une des valeurs exact, prefix ou suffix, ce qui signifie que les définitions des variables d’environnement retournées seront soit les paramètres exactes, ou placés avant ou après la valeur actuelle de ces paramètres. Lorsqu’il est omis, genre a pour valeur par défaut exact.

Cette option peut aussi être utilisé pour calculer les chemins de recherche combinés de plusieurs profils. Regardez cet exemple :

$ guix package -p foo -i guile
$ guix package -p bar -i guile-json
$ guix package -p foo -p bar --search-paths

La dernière commande ci-dessus montre la variable GUILE_LOAD_PATH bien que, pris individuellement, ni foo ni bar n’auraient donné cette recommandation.

--profile=profil
-p profil

Utiliser le profil à la place du profil par défaut de l’utilisateur.

--allow-collisions

Permettre des collisions de paquets dans le nouveau profil. À utiliser à vos risques et périls !

Par défaut, guix package rapporte les collisions dans le profil comme des erreurs. Les collisions ont lieu quand deux version ou variantes d’un paquet donné se retrouvent dans le profil.

--bootstrap

Utiliser le programme d’amorçage Guile pour compiler le profil. Cette option n’est utile que pour les développeurs de la distribution.

En plus de ces actions, guix package supporte les options suivantes pour demander l’état actuel d’un profil ou la disponibilité des paquets :

--search=regexp
-s regexp

Lister les paquets disponibles dont le nom, le synopsis ou la description correspondent à la regexp (en étant insensible à la casse), triés par pertinence. Afficher toutes les métadonnées des paquets correspondants au format recutils (voir GNU recutils databases dans GNU recutils manual).

Cela permet à des champs spécifiques d’être extraits avec la commande recsel, par exemple :

$ guix package -s malloc | recsel -p name,version,relevance
name: jemalloc
version: 4.5.0
relevance: 6

name: glibc
version: 2.25
relevance: 1

name: libgc
version: 7.6.0
relevance: 1

De manière similaire, pour montrer le nom de tous les paquets disponibles sous license GNU LGPL version 3 :

$ guix package -s "" | recsel -p name -e 'license ~ "LGPL 3"'
name: elfutils

name: gmp
…

Il est aussi possible de raffiner les résultats de la recherche en donnant plusieurs options -s à guix package, ou plusieurs arguments à guix search. Par exemple, la commande suivante renvoie la liste des jeux de plateau (cette fois-ci avec l’alias guix search) :

$ guix search '\<board\>' game | recsel -p name
name: gnubg
…

Si on avait oublié -s game, on aurait aussi eu les paquets logiciels qui s’occupent de circuits imprimés (en anglais : circuit board) ; supprimer les chevrons autour de board aurait aussi ajouté les paquets qui parlent de clavier (en anglais : keyboard).

Et maintenant un exemple plus élaboré. La commande suivante recherche les bibliothèques cryptographiques, retire les bibliothèques Haskell, Perl, Python et Ruby et affiche le nom et le synopsis des paquets correspondants :

$ guix search crypto library | \
    recsel -e '! (name ~ "^(ghc|perl|python|ruby)")' -p name,synopsis

Voir Selection Expressions dans GNU recutils manual pour plus d’information sur les expressions de sélection pour recsel -e.

--show=paquet

Afficher les détails du paquet dans la liste des paquets disponibles, au format recutils (voir GNU recutils databases dans GNU recutils manual).

$ guix package --show=python | recsel -p name,version
name: python
version: 2.7.6

name: python
version: 3.3.5

Vous pouvez aussi spécifier le nom complet d’un paquet pour n’avoir que les détails concernant une version spécifique :

$ guix package --show=python@3.4 | recsel -p name,version
name: python
version: 3.4.3
--list-installed[=regexp]
-I [regexp]

Liste les paquets actuellement installés dans le profil spécifié, avec les paquets les plus récemment installés en dernier. Lorsque regexp est spécifié, liste uniquement les paquets installés dont le nom correspond à regexp.

Pour chaque paquet installé, affiche les éléments suivants, séparés par des tabulations : le nom du paquet, sa version, la partie du paquet qui est installé (par exemple, out pour la sortie par défaut, include pour ses en-têtes, etc) et le chemin du paquet dans le dépôt.

--list-available[=regexp]
-A [regexp]

Lister les paquets actuellement disponibles dans la distribution pour ce système (voir Distribution GNU). Lorsque regexp est spécifié, liste uniquement les paquets dont le nom correspond à regexp.

Pour chaque paquet, affiche les éléments suivants séparés par des tabulations : son nom, sa version, les parties du paquet (voir Des paquets avec plusieurs résultats), et l’emplacement de sa définition.

--list-generations[=motif]
-l [motif]

Renvoyer la liste des générations avec leur date de création ; pour chaque génération, montre les paquets installés avec les paquets installés les plus récemment en dernier. Remarquez que la zéroième génération n’est jamais montrée.

Pour chaque paquet installé, afficher les éléments suivants, séparés par des tabulations : le nom du paquet, sa version, la partie du paquet qui a été installée (voir Des paquets avec plusieurs résultats), et l’emplacement du paquet dans le dépôt.

Lorsque motif est utilisé, la commande ne renvoie que les générations correspondantes. Les motifs valides sont :

--delete-generations[=motif]
-d [motif]

Lorsque motif est omis, supprimer toutes les générations en dehors de l’actuelle.

Cette commande accepte les même motifs que --list-generations. Lorsque motif est spécifié, supprimer les générations correspondante. Lorsque motif spécifie une durée, les générations plus vieilles que la durée spécifiée correspondent. Par exemple --delete-generations=1m supprime les générations vieilles de plus d’un mois.

Si la génération actuelle correspond, elle n’est pas supprimée. La zéroième génération n’est elle non plus jamais supprimée.

Remarquez que supprimer des générations empêche de revenir en arrière vers elles. Ainsi, cette commande doit être utilisée avec précaution.

Enfin, comme guix package peut démarrer des processus de construction, elle supporte les options de construction communes (voir Options de construction communes). Elle supporte aussi les options de transformation de paquets comme --with-source (voir Options de transformation de paquets). Cependant, remarquez que les transformations de paquets sont perdues à la mise à jour ; pour les préserver à travers les mises à jours, vous devriez définir vos propres variantes des paquets dans une module Guile et l’ajouter à GUIX_PACKAGE_PATH (voir Définition des paquets).


Suivant: , Précédent: , Monter: Gestion de paquets   [Table des matières][Index]