Próximo: , Anterior: , Acima: Desenvolvimento de software X   [Conteúdo][Índice]


7.3 Nível 2: O Repositório como Canal

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]