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!