Empacotando software com Conary

Muitas pessoas já tinham me pedido para escrever um pequeno tutorial sobre como empacotar software para o Foresight Linux. Para quem ainda não conhece o sistema de gerenciamento de pacotes Conary, uma forma de descrevê-lo seria compará-lo com um sistema de controle de versões e gerenciamento de pacotes. Isso quer dizer que você tem um controle sobre as modificações do código no mesmo estilo do CVS ou SVN, e qualquer modificação feita pelo mantenedor do código original é implementado em seu pacote em fragmentos, equivalentes às linhas que foram adicionadas ou modificadas.

Agora que estou lendo o parágrafo acima, notei que a explicação não foi muito bem feita. Quem sabe um exemplo mais simples ajudaria a causa?

Imagine então que você instalou seu programa preferido de ler fontes de notícias RSS. Beleza! Vamos então imaginar que amanhã o desenvolvidor/mantenedor deste programa descobre um erro, e rapidamente modifica uma linha de seu código para consertar este bug. Note a ênfase em uma linha. Eu, como desenvolvidor do Foresight empacoto esta versão e a habilito em nossos repositórios para consumo geral. Quando um usuário atualizar seu sistema, ele estará baixando o equivalente à aquela uma linha de código… e só! Em qualquer outro sistema de empacotamento, você tem de baixar o código (compilado) do programa inteiro para atualizar, mas o Conary te permite atualizar somente a diferença (diff)!

Bem, vamos então imaginar que você está preparado para empacotar algo usando o Conary. Existem alguns passos importantes que são necessários antes de você poder empacotar, mas vou deixar estes detalhes para um próximo artigo. Por agora, vou usar o meu próprio programa, BillReminder, como exemplo.

BillReminder é um código escrito em python e pygtk, atualmente hospedado no SourceForge.net. A versão atual disponibilizada para download é a versão 0.1.1. O motivo porque estou mencionando isso ficará mais claro em alguns segundos.

Para empacotar qualquer coisa com o Conary, tudo que você precisa fazer é criar um arquivo com instruções sobre onde e como conseguir o código fonte, entre outras coisas. Este arquivo, conhecido pelas pessoas acostumados com o Conary como “recipe”, ou “receita” em português, possui uma sintaxe bem “pythônica”, simples e clara. Segue abaixo minha pequena receita:

class BillReminder(PackageRecipe): name = ‘billreminder’ version = ‘0.1.1’ buildRequires = [] def setup(r): r.addArchive(‘mirror://sourceforge/%(name)s/') r.PythonSetup()

Este modelo de receita é bem básico, especial para empacotar programas escritos em python. Note as informações básicas, como nome, versão, e localização do código fonte. Devido ao seu “sabor” de python, podemos utilizar de expansão de variáveis para criar um URL dinâmico. a linha

r.addArchive(‘mirror://sourceforge/%(name)s/')

então é “traduzida” para: baixe a fonte em algum mirror do sourceforge.net, e procure pelo programa %(name)s, ou seja, billreminder. O sistema conary consegue “adivinhar” de forma lógica qual o pacote fonte para baixar, utilizando o nome e a versão para distinguir de qualquer outro programa ou versão disponível no mesmo local. Se você fosse então empacotar outro programa que também estivesse hospedado no Sourceforge.net, bastaria você modificar a variável “name” e “version”. Caso o código fonte estivesse em um outro servidor (sem mirrors), você modificaria o URL.

r.addArchive('http://[servidor]/%(name)s/')

Depois de fazer e salvar nossa receita como billreminder.recipe (o final do nome do arquivo tem de ser .recipe), é hora de “cozinharmos”. Geralmente, você “cozinha” sua receita 2 vezes. Na primeira vez, o sistema conary irá baixar o código fonte, compilá-lo, e completamente (e automaticamente) nos informar sobre todas as dependências necessárias para empacotar o programa. Rodando o comando:

cvc cook billreminder.recipe

nos devolve, entre muitas linhas de saída, a seguinte lista de dependências:

'python-setuptools:python', 'dbus-python:python', 'desktop-file-utils:runtime', 'notify-python:python', 'pygobject:python', 'pygtk:python', 'python-sqlite:python'

Ou seja, estes são os nomes dos pacotes e componentes requeridos pelo BillReminder. Editamos mais uma vez nossa “receita”, adicionando as dependências na variável “buildRequires”.

class BillReminder(PackageRecipe): name = ‘billreminder’ version = ‘0.1.1’ buildRequires = [‘python-setuptools:python’, ‘dbus-python:python’, ‘desktop-file-utils:runtime’, ‘notify-python:python’, ‘pygobject:python’, ‘pygtk:python’, ‘python-sqlite:python’] def setup(r): r.addArchive(‘mirror://sourceforge/%(name)s/') r.PythonSetup()

e cozinhamos mais uma vez com o mesmo comando anterior. Depois de mais alguns minutos, um arquivo contendo o programa compilado e todos os arquivos por ele usado será gerado. O nome deste arquivo é geralmente formado pelo nome do programa, billreminder, e a versão, 0.1.1, separados por um hífen, e terminando com um “.css”. Para instalar o programa, basta agora usar o conary.

sudo conary update billreminder-0.1.1.css

e pronto! Como eu tinha mencionado antes, existem algumas coisas que eu não mencionei aqui, coisas que te ajudam a disponibilizar este pacote em um repositório para que outros possam consumí-lo. Prometo que vou detalhar estes detalhes em um próximo artigo, mas só para terminar o processo, uma vez que seu pacote esteja em um repositório, outras pessoas poderão instalá-lo usando somente o nome do pacote (sem a versão e o .css).

Uma outra coisa muito interessante do conary, é o novo recurso de “cozinhar” código diretamente de um repositório SVN, CVS, ou Mercurial. Este recurso foi lançado ainda ontem (conary versão 1.1.23) e eu já tenho planos de empacotar o BillReminder desta forma.

Bem, espero não ter sido muito técnico ou vago neste artigo. Ainda estou aprendendo sobre o conary, e pretendo descrever em meu blog mais detalhes desta fascinante tecnologia!

Tags
comments powered by Disqus