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


4.7 Canaux

Guix et sa collection de paquets sont mis à jour en lançant guix pull (voir Invoquer guix pull). Par défaut guix pull télécharge et déploie Guix lui-même depuis le dépôt officiel de GNU Guix. Cela peut être personnalisé en définissant des canaux dans le fichier ~/.config/guix/channels.scm. Un canal spécifie l’URL et la branche d’un répertoire Git à déployer et on peut demander à guix pull de récupérer un ou plusieurs canaux. En d’autres termes, les canaux peuvent être utilisés pour personnaliser et pour étendre Guix, comme on le verra plus bas.

4.7.1 Utiliser un canal Guix personnalisé

Le canal nommé guix spécifie où Guix lui-même — ses outils en ligne de commande ainsi que sa collection de paquets — sera téléchargé. Par exemple, supposons que vous voulez effectuer les mises à jour depuis votre propre copie du dépôt Guix sur example.org, et plus particulièrement depuis la branche super-hacks. Vous pouvez écrire cette spécification dans ~/.config/guix/channels.scm :

;; Dit à « guix pull » d'utiliser mon propre dépôt.
(list (channel
        (name 'guix)
        (url "https://example.org/my-guix.git")
        (branch "super-hacks")))

Maintenant, guix pull récupérera le code depuis la branche super-hacks du dépôt sur example.org.

4.7.2 Spécifier des canaux supplémentaires

Vous pouvez aussi spécifier des canaux supplémentaires à récupérer. Disons que vous avez un ensemble de paquets personnels ou de variantes personnalisées qu’il ne vaudrait pas le coup de contribuer au projet Guix, mais que vous voudriez pouvoir utiliser de manière transparente sur la ligne de commande. Vous écririez d’abord des modules contenant ces définitions de paquets (voir Modules de paquets), en les maintenant dans un dépôt Git, puis vous ou n’importe qui d’autre pourrait l’utiliser comme un canal supplémentaire où trouver ces paquets. Sympa, non ?

Attention : Avant que vous, cher utilisateur, ne vous exclamiez « Oh mais c’est super génial ! » et que vous ne publiez vos canaux personnels publiquement, nous voudrions vous donner quelques avertissements :

Vous avez été prévenus ! Maintenant, nous pensons que des canaux externes sont une manière pratique d’exercer votre liberté pour augmenter la collection de paquets de Guix et de partager vos améliorations, qui sont les principes de bases du logiciel libre. Contactez-nous par courriel sur guix-devel@gnu.org si vous souhaitez discuter à ce propos.

Pour utiliser un canal, écrivez dans ~/.config/guix/channels.scm pour dire à guix pull de récupérer votre canal personnel en plus des canaux par défaut de Guix :

;; Ajouter mes paquets personnels à ceux fournis par Guix.
(cons (channel
        (name 'my-personal-packages)
        (url "https://example.org/personal-packages.git"))
      %default-channels)

Remarquez que le bout de code au-dessus est (comme toujours !) du code Scheme ; nous utilisons cons pour ajouter un canal à la liste des canaux que la variable %default-channels représente (voir cons and lists dans GNU Guile Reference Manual). Avec ce fichier en place, guix pull construit non seulement Guix mais aussi les modules de paquets de votre propre dépôt. Le résultat dans ~/.config/guix/current est l’union de Guix et de vos propres modules de paquets :

$ guix pull --list-generations
…
Génération 19	Aug 27 2018 16:20:48
  guix d894ab8
    URL du dépôt : https://git.savannah.gnu.org/git/guix.git
    branche : master
    commit : d894ab8e9bfabcefa6c49d9ba2e834dd5a73a300
  my-personal-packages dd3df5e
    URL du dépôt : https://example.org/personal-packages.git
    branche : master
    commit : dd3df5e2c8818760a8fc0bd699e55d3b69fef2bb
  11 nouveaux paquets : my-gimp, my-emacs-with-cool-features, …
  4 paquets mis à jour : emacs-racket-mode@0.0.2-2.1b78827, …

La sortie de guix pull ci-dessus montre que la génération 19 contient aussi bien Guix que les paquets du canal my-personal-packages. Parmi les nouveaux paquets et les paquets mis à jour qui sont listés, certains comme my-gimp et my-emacs-with-cool-features peuvent provenir de my-personal-packages, tandis que d’autres viennent du canal par défaut de Guix.

Pour créer un canal, créez un dépôt Git contenant vos propres modules de paquets et rendez-le disponible. Le dépôt peut contenir tout ce que vous voulez, mais un canal utile contiendra des modules Guile qui exportent des paquets. Une fois que vous avez démarré un canal, Guix se comportera comme si le répertoire de la racine du dépôt Git de ce canal était ajouté au chemin de chargement de Guile (voir Load Paths dans GNU Guile Reference Manual). Par exemple, si votre canal contient un fichier mes-paquets/mes-outils.scm qui définit un module Guile, le module sera disponible sous le nom de (mes-paquets mes-outils) et vous pourrez l’utiliser comme les autres modules (voir Modules dans GNU Guile Reference Manual).

4.7.3 Déclarer des dépendances de canaux

Les auteurs de canaux peuvent décider d’augmenter une collection de paquets fournie par d’autres canaux. Ils peuvent déclarer leur canal comme dépendant d’autres canaux dans le fichier de métadonnées .guix-channel qui doit être placé à la racine de dépôt du canal.

Le fichier de métadonnées devrait contenir une S-expression simple comme cela :

(channel
 (version 0)
 (dependencies
  (channel
   (name une-collection)
   (url "https://exemple.org/premiere-collection.git"))
  (channel
   (name some-autre-collection)
   (url "https://exemple.org/deuxieme-collection.git")
   (branch "testing"))))

Dans l’exemple ci-dessus, ce canal est déclaré comme dépendant de deux autres canaux, qui seront récupérés automatiquement. Les modules fournis par le canal seront compilés dans un environnement où les modules de tous les canaux déclarés sont disponibles.

Pour des raisons de fiabilité et de maintenabilité, vous devriez éviter d’avoir des dépendances sur des canaux que vous ne maîtrisez pas et vous devriez ajouter le minimum de dépendances possible.

4.7.4 Répliquer Guix

La sortie de guix pull --list-generations ci-dessus montre précisément quels commits ont été utilisés pour construire cette instance de Guix. Nous pouvons donc la répliquer, disons sur une autre machine, en fournissant une spécification de canal dans ~/.config/guix/channels.scm qui est « épinglé » à ces commits :

;; Déployer des commits précis de mes canaux préférés.
(list (channel
       (name 'guix)
       (url "https://git.savannah.gnu.org/git/guix.git")
       (commit "d894ab8e9bfabcefa6c49d9ba2e834dd5a73a300"))
      (channel
       (name 'my-personal-packages)
       (url "https://example.org/personal-packages.git")
       (branch "dd3df5e2c8818760a8fc0bd699e55d3b69fef2bb")))

La commande guix describe --format=channels peut même générer cette liste de canaux directement (voir Invoquer guix describe).

À ce moment les deux machines font tourner exactement le même Guix, avec l’accès exactement aux même paquets. La sortie de guix build gimp sur une machine sera exactement la même, au bit près, que la sortie de la même commande sur l’autre machine. Cela signifie aussi que les deux machines ont accès à tous les codes sources de Guix, et transitivement, à tous les codes sources de tous les paquets qu’il définit.

Cela vous donne des super-pouvoirs, ce qui vous permet de suivre la provenance des artefacts binaires avec un grain très fin et de reproduire les environnements logiciels à volonté — une sorte de capacité de « méta-reproductibilité », si vous voulez. Voir Inférieurs, pour une autre manière d’utiliser ces super-pouvoirs.


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