Suivant: Bonus: Package Variants, Précédent: Niveau 1 : Compiler avec Guix, Monter: Développement logiciel [Table des matières][Index]
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]