10 dic. 2011

Tutorial para Crear un DEB y subirlo a tu PPA

Si estas mirando esta entrada puede ser interesante que visites este tutorial anterior.

Este tutorial nos va a a enseñar a hacer lo siguiente de forma fácil:

1. Crear un proyecto sencillo en Python con novedades de Python3 + PyGObject + GtkBuilder + GTK3.
2. Crear un paquete .deb de 32bits o 64bits para nuestro proyecto en python
3. Subir un archivo fuente .tar.gz (changes) a nuestro repositorio en launchpad (PPA)

Vamos entonces a crear un PROYECTO bastante simple en python para crear un deb a partir de este y después crear un source y subirlo a nuestro PPA.

Como yo estoy arrancando un proyecto personal vamos a usar mi proyecto como referencia, ustedes lo pueden aplicar a cualquier proyecto o programa que tengan.

Lo primero sera crear el archivo de GtkBuilder usando la tecnología de GTK3 para ello simplemente abrimos Glade y creamos algo parecido a lo que les muestro en la siguientes imágenes.

Crean una ventana, agregan una barra de herramientas y agregan dos botones uno al que he nombrado Conectar y el otro Actualizar. Este programa que estoy creando en python permite conectar nuestro PC a nuestro Televisor usando DLNA por medio del demonio minidlna, es un programa bastante simple en esta versión que les muestro.


Recuerden poner la ventana Main Visible


En la pestaña Señales de la ventana principal Main agregan lo que ven en esta imagen para garantizar que el programa si cierre


Le damos una señal al boton conectar.


Le damos una señal al boton actualizar.



Con eso hemos terminado la parte gráfica del programa. Se que lo he explicado algo rápido pero si quieren aprender acerca de GtkBuilder es mejor que revisen mis tutoriales y los lean con calma.

Guardamos el archivo como GeoDLNA.ui y ya terminamos la parte grafica de GTK3

Ahora vamos a crear un archivo en Python.

import sys import os from gi.repository import Gtk login = os.getenv("HOME") class main: if os.path.exists(login+"/.minidlna/cache") == False: os.system("mkdir -p ~/.minidlna/cache") if os.path.isfile("/etc/minidlna.conf") == True: os.system("cp /etc/minidlna.conf ~/.minidlna") else: print ("Please install minidlna with apt-get install minidlna") def __init__(self): builder = Gtk.Builder() builder.add_from_file("/usr/share/geodlna/data/gui/GeoDLNA.ui") self.window = builder.get_object("Main") self.bconectar = builder.get_object("Conectar") self.bactualizar = builder.get_object("Actualizar") dict = {"on_Main_delete_event": self.quit, "on_conection_clicked": self.connect, "on_Reloaded_clicked":self.reloaded, } builder.connect_signals(dict) #Definicion del comando iniciar el servidor miniDLNA def connect(self, widget): if self.bconectar.get_stock_id() == "gtk-disconnect": os.system("minidlna -f"+login+"/.minidlna/minidlna.conf -P"+login+"/.minidlna/minidlna.pid") self.bconectar.set_stock_id("gtk-connect") self.bactualizar.set_sensitive(False) else: self.bconectar.set_stock_id("gtk-disconnect") self.bactualizar.set_sensitive(True) os.system("pkill minidlna") #Definicion de actualizar el servidor miniDLNA def reloaded(self,widget): os.system("minidlna -f"+login+"/.minidlna/minidlna.conf -R") self.bactualizar.set_sensitive(False) self.bconectar.set_stock_id("gtk-connect") def quit(self,*args): os.system("pkill minidlna") Gtk.main_quit() #Ejecucion del programa if __name__ == "__main__": main() Gtk.main()


Voy a explicar solo algunas cosas.

Importamos GTK3 usando from gi.repository

Login lo que hace es obtener la ruta hacia el directorio /home/user usando una funcion llamada os.getenv

os.path.exists es una función que permite determinar si una ruta a un archivo existe, en caso de que no exista os.system es como usar la terminal dentro de python y le damos crear una carpeta en nuestra /home con el nombre .minidlna.

os.path.isfile es la forma mas segura que conozco para verificar que un archivo existe, si es verdad entonces os.system que es como correr la terminal dentro de python lo copia de un punto y lo mete dentro de la carpeta que creamos hace poco.
Como pueden ver print ahora tiene () y eso se debe a que así funciona print en Python 3.

Definimos el constructor con la ventana y los botones y lo que necesitamos para el programa dentro de la funcion __init__

La función get_stock_id() lo que hace es determinar el nombre del icono del boton en este caso es desconectar.

La función set_stock_id() cambia el icono del botón en este caso por el del icono conectado.

La función set_sensitive(False) hace que un boton quede invalidado y evita que sea pulsable. En este programa en particular si el servidor DLNA esta conectado este no se puede actualizar.

Con eso he terminado de explicar las generalidades del programa en python, si las quieren en detallado me dejan algún comentario y les respondo lo que pregunten.
Guardamos lo anterior como geodlna.py



NOTA: SI EL PROGRAMA NO SE EJECUTA ES DEBIDO A LA LINEA 19 QUE FUE MODIFICADA PARA EL PASO DE CONSTRUIR EL .DEB, SI DESEA VER EL PROGRAMA EN FUNCIONAMIENTO CÁMBIELA POR LO SIGUIENTE:
builder.add_from_file("GeoDLNA.ui") 
RECUERDE ADICIONALMENTE QUE GeoDLNA.ui DEBE ESTAR EN LA MISMA CARPETA QUE geodlna.py


Ahora vamos a crear el proyecto, ya tenemos dos elementos, un archivo .ui y un archivo .py. Pero tenemos que crear algunas carpetas y una jerarquía de la misma.

Yo siempre hago lo siguiente.
Creo una carpeta llamada Proyecto, la pueden crear en cualquier lado puede ser el escritorio o donde quieran.
Dentro de la carpeta Proyecto creo una con el nombre del programa en este caso y usando las reglas de Debian tendríamos que nombrar la carpeta como geodlna-0.1, siempre se nombran así. Nombre de la carpeta-versión, en minúsculas.

Dentro de esta carpeta creamos una nueva carpeta que yo le pongo como nombre data y dentro de esta creo dos más a una la nombro media y a la otra la nombro gui.
Gráficamente la jerarquía queda de la siguiente forma.

Ahora es solo cuestión de llenar las carpetas.
En la carpeta geodlna-0.1 metemos el archivo de python geodlna.py
En la carpeta data no metemos nada
En la carpeta gui metemos el archivo creado en glade GeoDLNA.py
En la carpeta media metemos un icono para nuestro programa GeoDLNA.png

Falta un único archivo que tenemos que crear y ese el que permite abrir la aplicación cuando damos doble click.
Abrimos un documento de texto simple y pegamos lo siguiente, que crea ejecutables para nuestros programas en python. Lo voy a explicar pero solo un poco.


[Desktop Entry]
Version=0.1
Encoding=UTF-8
Name=GeoDLNA
GenericName=Controlador DLNA
Comment=Permite controlar el demonio minidlna
Exec=python /usr/geodlna/geodlna.py
Terminal=false
Type=Application
Categories=Gnome;Internet;
Icon=/usr/share/geodlna/data/media/GeoDLNA.png
StartupNotify=false


Version queda claro que indica la version en la que se encuentra el programa, Name indica el nombre del programa, nombre genérico es lo que hace el programa.

Exce es la linea que se encarga de buscar y ejecutar el programa, como ven esta apuntando a /usr/geodlna porque ahí es donde quedara el programa cuando tengamos listo el .DEB
Icon también apunta a donde quedara guardado el icono cuando tengamos listo el .DEB

Este archivo lo guardamos en la carpeta geodlna-0.1 con el nombre GeoDLNA.desktop

Ahora si, manos a la obra. Vamos a crear un archivo comprimido con el nombre geodlna_0.1.orig
Miren que cambiamos la geodolna- por geodlna_ y agregamos .orig


Este cambio de nombre es porque así lo maneja y lo entiende dh_make de Debian.

Listo ya tenemos las piezas listas, ahora vamos a abrir el terminal, no se asusten que realmente es bastante fácil de hacer.

sudo apt-get install dh-make

Eso lo hacemos para tener la herramienta que construye archivos Debianizados.
Ahora nos vamos desde la terminal hasta dentro de la carpeta geodlna-0.1 usando el comando cd
En mi caso es algo más o menos así.

cd /home/geojorg/Escritorio/Proyecto/geodlna-0.1

Ahora dentro de la carpeta vamos a ejecutar el siguiente comando.

dh_make -e geojorg@gmail.com     RECUERDEN PONER SU CORREO, EL MISMO DE LA FIRMA DIGITAL
Cuando el programa se ejecuta nos preguntara si queremos crear un binario singular, un binario indep, multiples binarios, libreria, modulo del kernel o patch para el kernel.

Nuestra respuesta es s (binario singular)


Le damos enter y hemos terminado de debianizar nuestro programa.

dh_make tiene muchas opciones muy completas pero como estamos haciendo nuestra primera aproximación al programa la verdad no quiero explicar cosas complejas pero no por menos muy interesantes.

MINI NOTA: NO CIERREN LA TERMINAL

Si volvemos a ver las carpetas dentro del programa vemos que se ha creado una nueva que dice Debian. Esta carpeta contiene archivos para crear el empaquetamiento .DEB

La abrimos y vamos a borrar todos los archivos que terminen en .ex porque todo el mundo siempre dice que hay que borrarlos y la verdad yo aun no se realmente cual es la funcionalidad de esos archivos, si alguien sabe que me deje el comentario.

Nos deben quedar entonces los siguientes archivos dentro de la carpeta Debian.

Vamos a revisarlos y a modificarlos para que cumplan una buena misión.

CHANGELOG
(EN ROJO LO MÁS INTERESANTE Y RELEVANTE EN EL CAMBIO)

geodlna (0.1-1) oneiric; urgency=low

  * Lanzamiento version 0.1
    -Interfaz GTK3 para Minidlna

 -- Jorge Guerrero  Fri, 09 Dec 2011 22:00:48 -0500


CONTROL
(EN ROJO LO MÁS INTERESANTE Y RELEVANTE EN EL CAMBIO)

Source: geodlna
Section: python
Priority: extra
Maintainer: Jorge Guerrero
Build-Depends: debhelper (>= 8.0.0), python (>= 2.7), minidlna
Standards-Version: 3.9.2
Homepage: <http://geowworld.blogspot.com>

Package: geodlna
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: GeoDLNA es una implementacion GTK para el demonio Minidlna que se encarga de enviar contenido multimedia a dispositivos que soporten tecnologia uPnP o DLNA.


Como pueden notar en el archivo anterior en donde dice Buil-Depends ponemos las dependencias del programa en este caso depende de Python superior a 2.7 y del demonio minidlna si estos no se encuentran instalados no podrá construir el .deb

COPYRIGHT
(EN ROJO LO MÁS INTERESANTE Y RELEVANTE EN EL CAMBIO)

Format: http://dep.debian.net/deps/dep5
Upstream-Name: Geodlna
Source: <http://geowworld.blogspot.com>

Files: *
Copyright: <2011>

License: <GPL v3>

Copyright: 2011 Jorge Guerrero

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see .

DIRS
(EN ROJO LO MÁS INTERESANTE Y RELEVANTE EN EL CAMBIO)

usr/geodlna
usr/share/geodlna
usr/share/applications



Este archivo usualmente esta vació y se puede dejar así pero a mi me gusta simplificar otro archivo y por eso creo este donde pongo los directorios que se crearan o buscaran.

Llegamos ahora al archivo más importante de todos RULES.


RULES
Este archivo es el más complejo y el mas difícil de tratar, encontraran en internet muchos debates de como hacerlo, que existen programas que lo hacen y aplicaciones para construirlo y demás, pero yo prefiero crearlo desde cero y lo explico paso a paso y creo que me ha funcionado con 6 o 7 programas en python con distinto grado de complejidad.

Cuando uno construye .deb o sources de paquetes que ya existen por ejemplo de totem o empathy o cualquier programa que se imaginen ya existente este archivo tiene una forma como esta:

%:
dh $@ 

Para esos caso ese archivo solo se deja con eso y debuild se encarga de construirlo usando ./configure make y make install y esas cosas complicadas o incluso autogen con las que no queremos lidiar.

En el caso de PYTHON se pueden usar scripts complejos o programas para crearlo pero aquí esta mi tip de hoy, lo mas relevante en ROJO y lo que usualmente tenemos que cambiar cuando vamos a construir un nuevo programa de Python.

#!/usr/bin/make -f
# -*- makefile -*-

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

configure: configure-stamp
configure-stamp:
dh_testdir
touch configure-stamp

build: build-stamp

build-stamp: configure-stamp
dh_testdir
touch build-stamp

clean:
dh_testdir
dh_testroot
rm -f build-stamp configure-stamp
dh_clean

install: build
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs

#Se pone el nombre que tendrá la carpeta que tendrá al programa dentro.
mkdir -p $(CURDIR)/debian/geodlna
cp geodlna.py $(CURDIR)/debian/geodlna/usr/geodlna
#Crea una carpeta para los datos y copia la actual de datos a esa
mkdir -p $(CURDIR)/debian/geodlna/usr/share/geodlna
cp -r data/ $(CURDIR)/debian/geodlna/usr/share/geodlna

#Copia el archivo .dekstop ejecutable
cp GeoDLNA.desktop $(CURDIR)/debian/geodlna/usr/share/applications

#Instalando los archivos de documentacion o ayuda (no aplica para este programa)
# mkdir -p $(CURDIR)/debian/geodlna/usr/share/doc/geodlna
# cp readme.txt $(CURDIR)/debian/usr/share/doc/geodlna/readme.txt


# Aquí se puede definir si se desean crear multiples binarios 32 bits o 64 bits, por defecto crea para nuestra arquitectura actual
binary-indep: build install

# Build architecture-dependent files here.
binary-arch: build install
dh_testdir
dh_testroot
dh_installchangelogs 
dh_installdocs
dh_installexamples
# dh_install
# dh_installmenu
# dh_installdebconf 
# dh_installlogrotate
# dh_installemacsen
# dh_installpam
# dh_installmime
# dh_installinit
# dh_installcron
# dh_installinfo
dh_installman
dh_link
dh_strip
dh_compress
dh_fixperms
# dh_perl
# dh_python
# dh_makeshlibs
dh_installdeb
dh_shlibdeps
dh_gencontrol
dh_md5sums
dh_builddeb

binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install configure

Vamos a terminar, se que deben estar cansados como yo en este punto pero ya casi terminamos

Volvemos a la terminal y ejecutamos

debuild

Si dice que no existe lo instalan con:

sudo apt-get install debuild

El programa en un punto nos va a pedir nuestra contraseña para la clava PGP y con eso terminara. Mostrando un archivo .deb como resultado. En este punto ya cumplimos la primera mision del tutorial que era crear un .deb.



El procedimiento anterior es solo para crear .deb pero si nuestra misión es agregar archivos a un repositorio PPA entonces antes de ejecutar en el terminal:

como debuild

Tenemos que ejecutar

debuild -S

Con eso creara las fuentes del programa y estas son las que le importan a Launchpad. Para subirlo al ppa simplemente desde la terminal le damos

dput ppa:geojorg/geo-minidlna geodlna_0.1-1_source.changes

Donde ppa:geojorg/geo-minidlna es el nombre que le pongamos a nuestro respositorio, con esto hemos terminado, ya launchpad se encarga de enviarnos un correo confirmando y dentro de unas 10 a 12 horas crea los paquetes deb para 32 bits y 64 bits de oneiric.

Cualquier duda adicional en los comentarios, gracias.

No hay comentarios:

Publicar un comentario