Creando paquetes para Ubuntu a lo fácil

Introducción

Hace ya algunos meses que escribí mi último artículo sobre empaquetado para Launchpad, «Crear paquetes para debian y Launchpad«, y desde entonces, he realizado algunos cambios en la forma de trabajar y empaquetar, sobre todo, gracias al trabajo de Miguel Angel.

Cuando empecé con esto, empaquetar, y subir a Launchpad, era un verdadero trabajo tedioso y anodino. Sin embargo, poco a poco, y con un par de herramientas, ahora es muy sencillo, lo que evidentemente se ve repercutido en que la reparación de errores, nuevas versiones, y mejoras en las aplicaciones las pueda realizar mucho mas a menudo, puesto que no me lleva nada de tiempo subir a Launchpad.

Este sistema de empaquetar es válido para aplicaciones donde no sea necesario compilar, como es el caso de Python.

La estructura

Para mostrar el sistema que utilizo, te recomiendo que descargues utilizando Bazaar (una herramienta de control distribuido, realmente sencilla de utilizar), la aplicación define-me. Para ello, en el terminal tienes que ejecutar el siguiente comando:

bzr branch lp:define-me

Una vez has descargado define-me, verás la siguiente estructura:

launchpad

De aquí hay que destacar el directorio «debian» que es el mínimo imprescindible, aparte en el caso de que quieras tener tu aplicación traducida a varios idiomas, necesitarás template1, que es el directorio en el que están guardadas las traducciones, y una herramienta «tools» que he creado para ayudarme con el tema de la actualización de las traducciones, y para incorporarlo en la creación del paquete como veremos más adelante.

El resto de directorios son opcionales. En «src», es donde coloco todo el código de Python. Los nombres de los directorios en principio no tienen porque ser iguales, como veremos mas adelante, sin embargo, si quieres utilizar la herramienta que te ayudará en las traducciones, necesitarás mantener la misma notación, de lo contrario el script no funcionará correctamente.

debian

Ahora vamos a la parte mas importante que es estudiar el directorio «debian». Hay una serie de archivos que no necesitas modificar, pero deben estar para que todo funcione correctamente:

launchpad

Son los siguientes:

  • el directorio «source» y su contenido
  • «compat»
  • «pyversions»
  • «rules» (hasta cierto punto)
  • «postinst» (hasta cierto punto)
  • «postrm» (hasta cierto punto)

«rules» no necesitas modificarlo siempre y cuando utilices el script «tools» para las traducciones, porque este script, es el que se encarga de actualizar este archivo para luego instale las traducciones de forma correcta. En cuanto a «postinst» y «postrm», tampoco los utilizarás inicialmente. Se tratan de dos scripts que se ejecutarán inmediatamente después de la instalación del paquete, e inmediatamente después de quitarlo, respectivamente. Supongo, que inicialmente no los utilizarás, pero si lo necesitas, hay abundante información en la red sobre ellos.

Los que si que hay que modificar

changelog

Empezamos por «changelog», que es donde se describen los cambios que hemos realizado, aparecerá el número de versión del paquete, así como el nombre de la versión de Ubuntu donde vamos a instalarlo. Por ejemplo, en el changelog de define-me, te encontrás algo como ésto:

define-me (0.3.1.2-1ubuntu1) oneiric; urgency=low

* Fixed a bug with preferences

-- atareao Sat, 15 Oct 2011 1$
...

Como ves en la primera línea aparece el nombre del paquete «define-me», seguido por la versión «0.3.1.2» y luego por «1ubuntu1» (esto último no lo tienes que modificar), luego aparece «oneiric», que es el código en clave de la versión de Ubuntu para la que subes el paquete, seguido por «urgency=low», que tampoco tienes que modificar.

De cualquier forma es conveniente, que para realizar modificaciones sobre este archivo utilices el comando:

dch -i

Esto lo tienes que hacer desde el terminal claro. Te abrirá tu editor por defecto que tengas establecido en el terminal, que en mi caso es «nano» y podrás añadir nuevas líneas sobre lo que has modificado. Pruébalo sobre este archivo y verás como funciona. Ten en cuenta que al ejecutar «dch -i» te incrementa la versión en «1ubuntu1», pasando a «1ubuntu2», esto lo tienes que corregir y dejarlo como estaba inicialmente.

control

La estructura de control es la siguiente:

Source: define-me
Section: utils
Priority: extra
Maintainer: atareao
Build-Depends: debhelper (>= 7.0.50~), python-support, python (>=2.4)
Standards-Version: 3.9.1
Homepage: http://www.atareao.es

Package: define-me
Architecture: all
Depends: ${misc:Depends}, ${python:Depends},
gir1.2-gtk-3.0,
gir1.2-gdkpixbuf-2.0,
gir1.2-webkit-3.0,
gir1.2-glib-2.0,
python-lxml
Description: A simple application to find words

«Source» y «Package» se corresponden con el nombre del paquete.
«Section» es la sección donde se instalará la aplicación, en este caso en «extra»
«Maintainer» el nombre y correo electrónico del que mantiene el paquete
«Arquitecture» all, dado que python es un lenguaje de programación interpretado, y no depende de la arquitectura sobre la que va instalado.
«Depends» las librerías de las que depende tu aplicación
«Description» una descripción de la aplicación

define-me.install

Aquí se llama define-me.install, pero si tu paquete se llama mipaquete, entonces el archivo se llamará «mipaquete.install», y en el se define que va donde. Por ejemplo, en el caso de define-me, el contenido es:

bin/* /usr/bin
src/* /usr/share/define-me
data/define-me.desktop /usr/share/applications
data/apps.define-me.gschema.xml /usr/share/glib-2.0/schemas
data/icons/define-me.svg /usr/share/pixmaps

donde decimos que, lo que haya en el directorio «bin» va a «/usr/bin», lo que hay en el directorio «src» va a «/usr/share/define-me» etc.

copyright

Aquí defines la licencia bajo la que liberas tu paquete. En mi caso, por defecto GNU/GPL 3.

Las traducciones

Para el caso de las traducciones, y en esto me refiero únicamente a las aplicaciones de Python, he creado el script que va incluido en «define-me». Me refiero a «tools». El funcionamiento es muy sencillo, solo tienes que ejecutar el siguiente comando en el terminal:

./tools

Y el se encarga de preparar los archivos de traducción en «template1» y de actualizar el archivo «debian/rules».

Subiendo el paquete a Launchpad

Para este proceso he creado un script, que puedes descargar desde aquí,

[wpfilebase tag=file path=’scripts/upload_package.gz’]

y que te permitirá subir el archivo a Launchpad sin calentamiento de cabeza. Solo tienes que hacer algunas modificaciones para que te funcione a ti sin problemas.

La primera es cambiar tu clave GPG, que viene definida en el archivo como KEY. Y lo siguiente es cambiar el repositorio de destino, que en mi caso es:

command = 'dput ppa:atareao/test %s'%(os.path.join(PARENT_DIR,DPUT))

si tu repositorio es «repositorio/repositorio», la cosa quedaría algo como:

command = 'dput ppa:repositorio/repositorio %s'%(os.path.join(PARENT_DIR,DPUT))

Una vez realizados estos cambios, copias el archivo a /usr/bin, y ya lo tienes disponible para todos tus paquetes.

Conclusión

Como ves, desde que empecé hasta ahora, el empaquetamiento se ha simplificado considerablemente. Puede ser que de inicio, te pueda parecer algo lioso, pero ni mucho menos, solo tienes que practicar y equivocarte un par de veces para que veas que es realmente sencillo. Te puedo asegurar, que desde que utilizo este método de empaquetamiento, el número de errores se ha reducido drásticamente, actualmente, uno o ninguno, y en caso de producirse, se debe a «1ubuntu1», que he comentado anteriormente.

En cuanto a las traducciones, ahora es realmente sencillo, simplemente, descargo las últimas actualizaciones de las mismas, las copio en la carpeta «template1», y ejecuto el script «tools» y a correr.

5 comentarios en “Creando paquetes para Ubuntu a lo fácil

  1. No tienes algo mas dificil!? una vez mas critico el actuar de los sistemas linux, no han evolucionado lo suficiente para proporcionar una forma mas facil de instalar un misero programa, tienen que darle un montón de vueltas al asunto para que digan que son geniales, que saben o que son genios de la informática. Aunque, reconosco que el articulo esta bien escrito y me gusto mucho la información, gracias por el trabajo y el tiempo que pusistes para compartirlo. Sin embargo, no dejo de criticar la forma que ne hacen las cosas, un usuario común tiene que tardar meses para poder dominar una simple instalación de una aplicación, de tantos codigos que tienen que ejecutar, y hablo de usuarios que no cuentan con acceso a internet que en muchos países latinoamericanos, es la realidad de cada día. Es la diferencia que nos ofrece Windows, que aunque nos regala un monton de virus, es tan facil descargar el paquete complero e instalarlo en nuestra pc, que no hace falta ser genio para hacerlo.
    Gracias de todos modos….lo tendré en cuenta dentro de un año que sea bueno en linux….

    1. Pero el articulo no habla sobre como instalar un programa, por favor lee con atención. Define-me se instala bien fácil. La instalación de programas en linux cada vez es mucho mas fácil, lo que pasa es que has de tener muy mala memoria

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *