Suivant: , Précédent: , Monter: Développement logiciel   [Table des matières][Index]


7.3 Niveau 2 : Le dépôt comme canal

Nous avons maintenant un dépôt Git contenant (entre autres) une définition de paquet (voir Niveau 1 : Compiler avec Guix). Ne pourrions-nous pas l’utiliser comme canal (voir Canaux dans Manuel de référence de GNU Guix) ? Après tout, les canaux sont conçues pour livrer des définitions de paquets aux utilisateurs, et c’est ce que nous faisons avec notre guix.scm.

Il s’avère que nous pouvons effectivement faire de notre dépôt un canal, mais à une condition : nous devons créer un dossier à part pour le(s) fichier(s) .scm du canal, afin que guix pull ne télécharge pas des .scm liées au dépôt lors d’une mise à jour — il y en a beaucoup dans Guile ! Voici donc notre disposition initiale, en conservant un lien symbolique à la racine vers guix.scm pour la commande guix shell :

mkdir -p .guix/modules
mv guix.scm .guix/modules/guile-package.scm
ln -s .guix/modules/guile-package.scm guix.scm

Pour rendre notre fichier guix.scm utilisable dans le canal, nous devons l’adapter en module de paquets (voir Modules de paquets dans Manuel de référence de GNU Guix) en utilisant define-module à la place de use-modules au début. Nous devons également exporter une variable de paquet avec define-public tout en retournant le paquet à la fin du fichier pour qu’il reste utilisable avec guix shell et guix build -f guix.scm. Le résultat final ressemble à ça (en omettant les parties identiques) :

(define-module (guile-package)
  #:use-module (guix)
  #:use-module (guix git-download)   ;for ‘git-predicate’
  )

(define vcs-file?
  ;; Return true if the given file is under version control.
  (or (git-predicate (dirname (dirname (current-source-directory))))
      (const #t)))                                ;not in a Git checkout

(define-public guile
  (package
    (name "guile")
    (version "3.0.99-git")                          ;funky version number
    (source (local-file "../.." "guile-checkout"
                        #:recursive? #t
                        #:select? vcs-file?))
    ))

;; Return the package object define above at the end of the module.
guile

Il nous manque plus que le dernier élément : le fichier .guix-channel qui permet à Guix de trouver les modules de paquets de notre dépôt :

;; This file lets us present this repo as a Guix channel.

(channel
  (version 0)
  (directory ".guix/modules"))  ;look for package modules under .guix/modules/

Pour récapituler, nous avons :

.
├── .guix-channel
├── guix.scm  .guix/modules/guile-package.scm
└── .guix
    └── modules
       └── guile-package.scm

Et voilà, nous avons un canal ! (Nous pourrions faire mieux en ajoutant le support de l’authentification de canal pour garantir l’authenticité du code. Nous n’entrerons pas dans les détails mais il peut être important de le considérer!) Les utilisateurs peuvent récupérer notre canal avec le fichier ~/.config/guix/channels.scm en y ajoutant quelque chose du genre :

(append (list (channel
                (name 'guile)
                (url "https://git.savannah.gnu.org/git/guile.git")
                (branch "main")))
        %default-channels)

Après un guix pull, nous pouvons voir les nouveaux paquets :

$ guix describe
Generation 264  May 26 2023 16:00:35    (current)
  guile 36fd2b4
    repository URL: https://git.savannah.gnu.org/git/guile.git
    branch: main
    commit: 36fd2b4920ae926c79b936c29e739e71a6dff2bc
  guix c5bc698
    repository URL: https://git.savannah.gnu.org/git/guix.git
    commit: c5bc698e8922d78ed85989985cc2ceb034de2f23
$ guix package -A ^guile$
guile   3.0.99-git      out,debug       guile-package.scm:51:4
guile   3.0.9           out,debug       gnu/packages/guile.scm:317:2
guile   2.2.7           out,debug       gnu/packages/guile.scm:258:2
guile   2.2.4           out,debug       gnu/packages/guile.scm:304:2
guile   2.0.14          out,debug       gnu/packages/guile.scm:148:2
guile   1.8.8           out             gnu/packages/guile.scm:77:2
$ guix build guile@3.0.99-git
[…]
/gnu/store/axnzbl89yz7ld78bmx72vpqp802dwsar-guile-3.0.99-git-debug
/gnu/store/r34gsij7f0glg2fbakcmmk0zn4v62s5w-guile-3.0.99-git

Voici comment, en tant que développeuse, vous pouvez livrer votre logiciel directement aux utilisateurs ! Sans aucun intermédiaire, sans perte de transparence et un suivi de la provenance.

De plus, il devient également trivial de créer des images Docker, des paquets Deb/RPM ou une archive avec guix pack (voir Invoquer guix pack dans Manuel de référence de GNU Guix) :

# How about a Docker image of our Guile snapshot?
guix pack -f docker -S /bin=bin guile@3.0.99-git

# And a relocatable RPM?
guix pack -f rpm -R -S /bin=bin guile@3.0.99-git

Suivant: Bonus: Package Variants, Précédent: Niveau 1 : Compiler avec Guix, Monter: Développement logiciel   [Table des matières][Index]