Próximo: Bônus: Variantes do pacote, Anterior: Nível 1: Construindo com Guix, Acima: Desenvolvimento de software X [Conteúdo][Índice]
Agora temos um repositório Git contendo (entre outras coisas) uma definição de pacote (veja Nível 1: Construindo com Guix). Não podemos transformá-lo em um channel (veja Canais em Manual de referência do GNU Guix)? Afinal, os canais são projetados para enviar definições de pacotes aos usuários, e é exatamente isso que estamos fazendo com nosso guix.scm.
Acontece que podemos realmente transformá-lo em um canal, mas com uma
ressalva: precisamos criar um diretório separado para o(s) arquivo(s)
.scm
do nosso canal para que guix pull
não carregue
arquivos .scm
não relacionados quando alguém puxar o canal — e no
Guile, há muitos deles! Então, começaremos assim, mantendo um link simbólico
guix.scm de nível superior para o bem do guix shell
:
mkdir -p .guix/modules mv guix.scm .guix/modules/guile-package.scm ln -s .guix/modules/guile-package.scm guix.scm
Para torná-lo utilizável como parte de um canal, precisamos transformar
nosso arquivo guix.scm em um módulo de pacote (veja Módulos
de pacote em Manual de referência do GNU Guix): fazemos isso
alterando o formulário use-modules
no topo para um formulário
define-module
. Também precisamos realmente exportar uma
variável de pacote, com define-public
, enquanto ainda retornamos o
valor do pacote no final do arquivo para que ainda possamos usar
guix shell
e guix build -f guix.scm
. O resultado final
se parece com isso (não repetindo coisas que não mudaram):
(define-module (guile-package) #:use-module (guix) #:use-module (guix git-download) ;para ‘git-predicate’ …) (define vcs-file? ;; Retorna verdadeiro se o arquivo fornecido estiver sob controle de versão. (or (git-predicate (dirname (dirname (current-source-directory)))) (const #t))) ;não em um checkout do Git (define-public guile (package (name "guile") (version "3.0.99-git") ;número da versão funky (source (local-file "../.." "guile-checkout" #:recursive? #t #:select? vcs-file?)) …)) ;; Retorna o objeto do pacote definido acima no final do módulo. guile
Precisamos de uma última coisa: um arquivo
.guix-channel
para que o Guix saiba onde procurar módulos de pacote em nosso repositório:
;; Este arquivo nos permite apresentar este repositório como um canal Guix. (channel (version 0) (directory ".guix/modules")) ;procure por módulos de pacote em .guix/modules/
Para recapitular, agora temos estes arquivos:
. ├── .guix-channel ├── guix.scm → .guix/modules/guile-package.scm └── .guix └── modules └── guile-package.scm
E é isso: temos um canal! (Poderíamos fazer melhor e dar suporte a
autenticação
de canal para que os usuários saibam que estão extraindo código
genuíno. Vamos poupá-lo dos detalhes aqui, mas vale a pena considerar!) Os
usuários podem extrair deste canal por
adicionando-o
a ~/.config/guix/channels.scm
, ao longo destas linhas:
(append (list (channel
(name 'guile)
(url "https://git.savannah.gnu.org/git/guile.git")
(branch "main")))
%default-channels)
Após executar guix pull
, podemos ver o novo pacote:
$ guix describe Geração 264 26 de maio de 2023 16:00:35 (atual) 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
É assim que, como desenvolvedor, você tem seu software entregue diretamente nas mãos dos usuários! Sem intermediários, mas sem perda de transparência e rastreamento de procedência.
Com isso em prática, também se torna trivial para qualquer um criar imagens
Docker, pacotes Deb/RPM ou um tarball simples com guix pack
(veja Invocando guix pack em Manual de Referência GNU Guix):
# Que tal uma imagem Docker do nosso instantâneo Guile? guix pack -f docker -S /bin=bin guile@3.0.99-git # E um RPM relocável? guix pack -f rpm -R -S /bin=bin guile@3.0.99-git
Próximo: Bônus: Variantes do pacote, Anterior: Nível 1: Construindo com Guix, Acima: Desenvolvimento de software X [Conteúdo][Índice]