Este es uno de los capítulos del tutorial Como crear un repositorio PPA para distribuir tus aplicaciones. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
En el artículo anterior de esta serie, vimos como crear tu clave PGP, paso indispensable para subir tus paquetes al al repositorio que creamos en el primer artículo. En este artículo veremos como crear la estructura de directorios y como disponer los archivos, para crear un paquete. Posteriormente veremos como subir un paquete a tu PPA.
De esta manera, todos los usuarios que añadan este repositorio a su equipo con Ubuntu, Linux Mint o derivado, podrá instalar con toda facilidad ese paquete, además de tenerlo siempre actualizado. Eso si, nosotros por nuestra parte, además de crear un paquete, debemos mantenerlo actualizado.
Crear y subir un paquete a tu PPA.
El primer paso antes de subir un paquete a tu PPA es la creación del paquete. Para ello, es necesario definir una serie de archivos de información, sobre lo que contiene el paquete, que tipo de paquete es, y alguna información mas que veremos mas adelante.
Crear un paquete sencillo…
En este tercer artículo, y con el fin de que entiendas los pasos básicos, crearemos un paquete muy sencillo, es mas, será un paquete extremadamente simple. Este paquete lo único que contendrá será un icono. Tan sencillo como eso. Como veremos, que el paquete contenga uno, diez o un millón de archivos, no complica nada el asunto, pero de esta forma, tendremos una idea de lo que se necesita y como se debe hacer. Una vez que veas el funcionamiento para un archivo, puedes extrapolar y aplicar a cualquier cosa que te puedas imaginar.
En artículos posteriores de esta serie, veremos como empaquetar paquetes mas complejos, como pueden ser fondos de pantalla o paquetes para Python o Vala.
La estructura de archivos para crear nuestro paquete
Para ayudarte en la creación del paquete, he añadido un nuevo repositorio a GitHub, llamado unicono donde puedes encontrar todo el código correspondiente a este primer paquete. Este repositorio lo puedes utilizar, como punto de partida, para crear tus propios paquetes, según vayamos viendo.
Si te fijas en la siguiente captura de pantalla, verás que disponemos de dos directorios, uno llamado data
y un segundo llamado debian
. Mientras que el primero es opcional y lo podíamos haber llamado como hubieramos querido, este segundo es obligatorio.
La información DEBIAN
Como he comentado en la introducción, además de los archivos que queramos que contenga nuestro paquete, es necesario, que el paquete contenga información sobre lo que hay en el mismo. Esta información se da mediante el contenido del directorio debian
. A continuación puedes ver una captura de pantalla de su contenido, que paso a comentar en detalle,
source/format
. En el archivoformat
que se encuentra en el directoriosource
encontraremos una única línea que indica el formato de nuestro paquete. Existen dos tipos3.0 (native)
y3.0 (quilt)
. El primero es para paquetes nativos Debian, y el segundo es para lo que sea. En principio, yo utilizo siempre el primero.changelog
. Este archivo es imprescindible para crear nuestro paquete. Debe tener una estructura como la que muestro a continuación,
unicono (0.0.1-0extras17.04.0) zesty; urgency=low * First version -- Lorenzo Carbonell <lorenzo.carbonell.cerezo@gmail.com> Sun, 11 Oct 2015 08:55:30 +0200
Lo mas sencillo es que utilices este ejemplo y modifiques lo que necesites, excepto fecha y hora, así como el firmante, que de eso ya se encarga las dos herramientas que veremos a continuación. También puedes utilizar dh_make
que te crea la estructura básica, tanto de changelog
como del resto de archivos. Sin embargo, te añade algunos que no son necesarios y he preferido no incluirlos.
Para gestionar el archivo changelog
disponemos de la herramienta dch
. Esta herramienta tiene dos opciones que son las que utilizo habitualmente, -r
que se utiliza cuando se libera una versión, aunque yo solo la utilizo para cambiar la fecha, y actualizar los cambios que he ido añadiendo.
Por otro lado tenemos la opción -i
que lo que hace es crea una nueva línea de versión. Así podemos subir una nueva versión del paquete.
compat
. Este archivo define el nivel de compatibilidad con debhelper que es la herramienta que se utiliza para crear los paquetes. Actualmente debe ser 10, aunque se puede utilizar 9 para compatibilidad con sistemas antiguos.control
. Aquí se define el nombre del paquete, prioridad, mantenedor, dependencias, versión, etc. Las primeras líneas, hasta la línea en blanco, se corresponde con la información para el paquete fuente, mientras que las siguientes líneas se corresponden con el paquete binario. En nuestro ejemplo, el contenido es el siguiente,
Source: unicono Section: x11 Priority: optional Maintainer: Usuario <email> Build-Depends: debhelper (>= 10) Standards-Version: 4.0.0 Homepage: https://www.atareao.es/ Package: unicono Architecture: all Description: Primer ejemplo de empaquetamiento Esto es un ejemplo de como crear un paquete
Aquí hay tendrás que cambiar, el nombre del paquete tanto en Source como en Package; la sección, que podrá ser una de las siguientes secciones; el mantenedor, y la descripción del contenido de tu paquete. Ten en cuenta que la primera línea de Description es para el texto corto, y las líneas inferiores para el texto largo. Estas líneas deben empezar con un espacio.
rules
. Define las reglas de lo que hay que hacer. En este primer ejemplo, no vamos a tocar nada, y dejaremos el archivo tal y como está.install
. Aquí pondremos un listado de todos los archivos que queremos instalar. Por ejemplo,
data/ubuntu.svg /usr/share/icons/hicolor/scalable/apps/
Cada línea se compone de dos partes. La parte de la izquierda es el archivo o archivos que queremos instalar, y la segunda es donde queremos instalarlo. Para indicar el archivo que queremos instalar lo haremos de forma relativa al directorio padre de debian
.
También podemos indicar varios archivos, por ejemplo,
data/*.svg /usr/share/icons/hicolor/scalable/apps/
No es conveniente poner data/*
, por ejemplo. Si tuviéramos directorios dentro de data
al crear el paquete se generaría un error.
Creando el paquete
Con esto, ya hemos visto todo el contenido del directorio debian
, y tenemos la estructura de nuestro paquete. Ahora vamos a crearlo antes de subir el paquete a tu PPA.
Para ello, debes ejecutar la siguiente orden, en el directorio superior a debian
, y sustituyendo TUCLAVE por el ID
de la clave.
debuild -S -sa -kTUCLAVE
Para encontrar el ID
de tu clave, debes abrir Contraseñas y claves
y seleccionar tu clave. En las propiedades de tu clave, pestaña propietario, encontrarás el ID
En el directorio padre del padre de debian (lo siento si confunde), encontrarás los archivos creados,
unicono_0.0.1-0extras17.04.1.dsc unicono_0.0.1-0extras17.04.1_source.build unicono_0.0.1-0extras17.04.1_source.changes unicono_0.0.1-0extras17.04.1.tar.xz
Subir el paquete a tu PPA
Ha llegado el momento final y que estabas esperando (probablemente te hayas saltado parte del artículo solo para llegar aquí…). Aquí, situado igualmente en el mismo directorio que en el apartado anterior, deberás ejecutar la siguiente orden,
dput ppa:lorenzoatareao/mi-primer-repositorio unicono_0.0.1-0extras17.04.1_source.changes
Pero, por supuesto adecuado a tu propio PPA. Si todo ha ido bien habrás subido un paquete a tu PPA, y en el emulador de terminal, verás un mensaje como el que reproduzco a continuación,
Checking signature on .changes gpg: Firmado el mié 20 sep 2017 19:03:33 CEST gpg: usando RSA clave CEF5DEE0DE5CBBE5 gpg: Firma correcta de "User <email>" [absoluta] Good signature on /datos/Sync/Programacion/Ubuntu/unicono_0.0.1-0extras17.04.1_source.changes. Checking signature on .dsc gpg: Firmado el mié 20 sep 2017 19:03:33 CEST gpg: usando RSA clave CEF5DEE0DE5CBBE5 gpg: Firma correcta de "User <email>" [absoluta] Good signature on /datos/Sync/Programacion/Ubuntu/unicono_0.0.1-0extras17.04.1.dsc. Uploading to ppa (via ftp to ppa.launchpad.net): Uploading unicono_0.0.1-0extras17.04.1.dsc: done. Uploading unicono_0.0.1-0extras17.04.1.tar.xz: done. Uploading unicono_0.0.1-0extras17.04.1_source.changes: done. Successfully uploaded packages.
Conclusión
Inicialmente puede parecer ligeramente complicado, pero una vez comprendes los mecanismos y el funcionamiento, verás que es algo realmente sencillo de gestionar y de mantener.
Con este primer ejemplo, puedes crear un paquete de iconos, o de fondos de pantalla, que sea de fácil distribución. Además, y como he repetido ya en varias ocasiones, tiene la ventaja de ser fácil de mantener, y de actualizar entre todos los usuarios que lo disfruten. En los siguientes artículos vamos a ver otras instalaciones algo mas complejas (no mucho mas) orientadas a Python y Vala.
Más información,
Gracias..!! Maestro. Lo pondremos en practica a ver que sale.
Muchas gracias por el post! Voy a ver si me animo a hacer un repositorio con mis programillas y mis cosas 🙂
Hola,
De verdad que no es nada complicado. Al principio, es un poco engorroso, pero en cuanto conoces el funcionamiento, es cuestión de coser y cantar. Anímate a crear tu propio repositorio, y si quieres me dices, y lo publicó aquí (si quieres claro).
Un saludo.
Uhmm… no sé si te lo comenté en otro post. Algo que me come la cabeza es cuando desarrollo un programa en C, C++… bueno, cualquier lenguaje que se compile. ¿Tengo que compilarlo en varias versiones de la distribución para ofrecerlas? O existe alguna forma (o servicio) para compilar el paquete en varias versiones y arquitecturas.
Tengo algunos programillas que me gustaría ofrecer. Para arquitecturas, sí que se puede cross-compilar, pero por ejemplo ¿para varias versiones de Ubuntu con diferentes versiones de las bibliotecas? ¿Cómo se te ocurre?
¡¡ Un saludo !!
En el caso de Launchpad el que lo compila es el propio servicio, pero necesitas darle las instrucciones necesarias e indicarles para que arquitecturas quieres que lo compiles?
Saludos.
¡Saludos!
¿Existe alguna manera de publicar paquetes para Debian en Launchpad? Hace tiempo se encontraban algunos repos para Debian, pero lo he intentado infructuosamente… o me estoy saltando algo…