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


6.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. Ces opérations fonctionnent sur un profil utilisateur—un répertoire avec les paquets installés. Chaque utilisateur a un profile par défaut dans $HOME/.guix-profile. La commande n’opère que dans le profil de l’utilisateur·rice et fonctionne avec les privilèges 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·rice 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ù on spécifie l’ensemble exact des paquets qui doivent être disponibles que l’on passe via l’option --manifest (voir --manifest).

Pour chaque utilisateur·rice, un lien symbolique vers son profil par défaut est automatiquement créé dans $HOME/.guix-profile. Ce lien symbolique pointe toujours vers la génération actuelle du profil par défaut du compte. Ainsi, on peut ajouter $HOME/.guix-profile/bin à sa 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 "$GUIX_PROFILE/etc/profile"

Dans un environnement multi-utilisateur·rice, les profils des utilisateur·rice·s sont stockés dans un emplacement enregistré comme garbage-collector root, vers lequel $HOME/.guix-profile pointe (voir Invoquer guix gc). Ce répertoire est normalement localstatedir/guix/profiles/per-user/user, où localstatedir est la valeur passée à configure comme --localstatedir, et user est le nom d’utilisateur·rice. Le répertoire per-user est créé au démarrage de guix-daemon, 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 un simple nom de paquet, tel que guile, éventuellement suivi d’un arobase et d’un numéro de version, tel que guile@3.0.7 ou simplement guile@3.0. (dans ce dernier cas, la version la plus récente préfixée par 3.0 est sélectionnée).

Si aucun numéro de version n’est spécifié, la version la plus récente disponible est choisie. En plus, une telle spécification de 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).

Autrement, un paquet peut directement spécifier un fichier du dépôt comme /gnu/store/...-guile-3.0.7, produit par exemple par guix build.

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·rice.

En outre, les paquets s’appuient parfois sur la définition de variables d’environnement pour leurs chemins de recherche (voir l’explication de l’--chemins de recherche ci-dessous). Toute définition de variable d’environnement manquante ou éventuellement incorrecte est reporté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+))

Lorsqu’on développe, on peut trouver utile d’inclure un tel fichier guix.scm à la racine de l’arborescence des sources de son projet qui pourrait être utilisé pour tester des versions de développement et créer des environnements de développement reproductibles (voir Invoquer guix shell).

Le fichier peut aussi contenir une représentation JSON d’une ou de plusieurs définitions de paquets. L’exécution de guix package -f sur hello.json avec le contenu suivant entraînerait l’installation du paquet greeter après la construction de myhello :

[
  {
    "name": "myhello",
    "version": "2.10",
    "source": "mirror://gnu/hello/hello-2.10.tar.gz",
    "build-system": "gnu",
    "arguments": {
      "tests?": false
    }
    "home-page": "https://www.gnu.org/software/hello/",
    "synopsis": "Hello, GNU world: An example GNU package",
    "description": "GNU Hello prints a greeting.",
    "license": "GPL-3.0+",
    "native-inputs": ["gettext"]
  },
  {
    "name": "greeter",
    "version": "1.0",
    "source": "https://example.com/greeter-1.0.tar.gz",
    "build-system": "gnu",
    "arguments": {
      "test-target": "foo",
      "parallel-build?": false,
    },
    "home-page": "https://example.com/",
    "synopsis": "Greeter using GNU Hello",
    "description": "This is a wrapper around GNU Hello.",
    "license": "GPL-3.0+",
    "inputs": ["myhello", "hello"]
  }
]
--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 un ou plusieurs regexp sont spécifiés, la mise à jour n’installera que les paquets dont le nom correspond à regexp. Voir aussi l’option --do-not-upgrade ci-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).

Quand une mise à jour est en cours d’exécution, les transformations de paquets initialement appliquées lors de la création du profil sont automatiquement réappliquées (voir Options de transformation de paquets). Par exemple, supposons que vous ayez d’abord installé Emacs depuis l’extrémité de sa branche de développement avec :

guix install emacs-next --with-branch=emacs-next=master

La prochaine fois que vous lancerez guix upgrade, Guix va à nouveau extraire l’extrémité de la branche de développement Emacs et construira emacs-next à partir de ce checkout.

Notez que les options de transformation comme --with-branch et --with-source dépendent de l’état exterieur ; c’est à vous de vous assurer qu’elles fonctionnent comme souhaité. Vous pouvez également écarter une transformation qui s’applique à un paquet en lançant :

$ guix install paquet
--do-not-upgrade[=regexp …]

Lors d’une utilisation conjointe 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. Cette option peut être répétée plusieurs fois, auquel cas les manifestes sont concaténés.

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 renvoyer 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")))

Voir Écrire un manifeste, pour des informations sur la manière d’écrire un manifeste. Voir --export-manifest, pour apprendre à obtenir un fichier manifeste depuis un profil existant.

--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, Le retour en arrière se produit 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 génération initiale, 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·rice (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 (voir Chemins de recherche, pour des infos sur les spécifications de chemins de recherche associées aux paquets).

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 renvoyées seront soit les paramètres exacts, soit 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 toto -i guile
$ guix package -p titi -i guile-json
$ guix package -p toto -p titi --search-paths

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

--profile=profil
-p profil

Utiliser le profil à la place du profil par défaut du compte.

profil doit être le nom d’un fichier qui sera créé une fois terminé. Concrètement, profil sera un simple lien symbolique (« symlink ») pointant vers le profil réel où les paquets sont installés :

$ guix install hello -p ~/code/my-profile
…
$ ~/code/my-profile/bin/hello
Hello, world!

Tout ce qu’il faut pour se débarrasser du profil est de supprimer ce lien symbolique et ses frères et sœurs qui pointent vers des générations spécifiques :

$ rm ~/code/my-profile ~/code/my-profile-*-link
--list-profiles

Liste tous les profils utilisateur·rice :

$ guix package --list-profiles
/home/charlie/.guix-profile
/home/charlie/code/my-profile
/home/charlie/code/devel-profile
/home/charlie/tmp/test

En cours d’exécution sous root, liste tous les profils de tou·te·s les utilisateur·rice·s.

--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 qu’aux personnes qui développent 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=guile | recsel -p name,version
name: guile
version: 3.0.5

name: guile
version: 3.0.2

name: guile
version: 2.2.7
…

Vous pouvez aussi spécifier le nom complet d’un paquet pour n’avoir que les détails concernant une version spécifique (cette fois-ci avec l’alias guix show) :

$ guix show guile@3.0.5 | recsel -p name,version
name: guile
version: 3.0.5
--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é, lister 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 :

  • Des entiers et des entiers séparés par des virgules. Les deux motifs correspondent numéros de génération. Par exemple, --list-generations=1 renvoie la première.

    Et --list-generations=1,8,2 renvoie les trois générations dans l’ordre spécifié. Aucun espace ni virgule surnuméraire ne sont permis.

  • Ranges. --list-generations=2..9 affiche les générations demandées et tout ce qui se trouve entre elles. Remarquez que le début d’un intervalle doit être plus petit que sa fin.

    Il est aussi possible d’omettre le numéro final. Par exemple, --list-generations=2.. renvoie toutes les générations à partir de la deuxième.

  • Des durées. Vous pouvez aussi récupérer les derniers N jours, semaines, ou mois en passant un entier avec la première lettre de la durée (en anglais : d, w ou m). Par exemple --list-generations=20d liste les générations qui sont âgées d’au plus 20 jours.
--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é, supprime les générations correspondantes. Lorsque motif spécifie une durée, les générations plus anciennes 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.

--export-manifest

Écrire un manifeste vers la sortie standard utilisable avec --manifest et qui correspond à un ou plusieurs profils choisis.

Cette option est conçue pour vous aider à migre du mode de fonctionnement « impératif » — lancer guix install, guix upgrade, etc — au mode déclaratif offert par --manifest.

Soyez conscient que le manifeste qui est résulte est une approximation de ce que votre profil contient vraiment ; par exemple, en fonction de la manière dont votre profil a été créé, il peut se référer à des paquets ou des versions de paquets qui ne sont pas exactement ce que vous avez spécifié.

Gardez en tête qu’un manifeste est purement symbolique : il ne contient que des noms de paquets et éventuellement des versions, et leur signification varie avec le temps. Si vous voulez « épingler » des canaux aux révisions qui ont été utilisées pour construire les profils, voir --export-channels plus bas.

--export-channels

Écrit sur la sortie standard la liste des canaux utilisés par les profils choisi, dans un format convenable pour guix pull --channels ou guix time-machine --channels (voir Canaux).

Avec --export-manifest, cette option fournit les informations qui vous permettent de répliquer le profil actuel (voir Répliquer Guix).

Cependant, remarquez que la sortie de cette commande est une approximation de ce qui a vraiment été utilisé pour construire le profil. En particulier, a profil unique peut avoir été construit à partir de plusieurs révisions du même canal. Dans ce cas, --export-manifest choisi la dernière et écrit la liste des autres révisions dans un commentaire. Si vous avez vraiment besoin de choisir des paquets à partir d’autres révisions des canaux, vous pouvez utiliser des inférieurs dans votre manifeste pour cela (voir Inférieurs).

Avec --export-manifest, c’est un bon point de départ si vous voulez migrer du modèle « impératif » au modèle complètement déclaratif qui consiste en un fichier manifeste et un fichier de canaux qui épingle les révisions exactes des canaux que vous voulez.

Enfin, comme guix package peut démarrer des processus de construction, il supporte les options de construction communes (voir Options de construction communes). Il prend aussi en charge les options de transformation de paquets comme --with-source, et les préserve à travers les mises à jour (voir Options de transformation de paquets).


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