Python Madrid empaquetamiento deb aplicaciones Python

Download Python Madrid empaquetamiento deb aplicaciones Python

Post on 03-Jul-2015

2.485 views

Category:

Technology

3 download

Embed Size (px)

DESCRIPTION

Python Empaquetamiento Deb I Python Madrid 14/4/2011

TRANSCRIPT

<ul><li> 1. Python Empaquetamiento Deb I Python Madrid 14/4/2011</li></ul> <p> 2. Quin... [email_address] [email_address] http://www.eferro.net eferro DrTrucho 3. Disclaimeronline de contenido abierto, es decir,"no me responsabilizo del contenido"voluntaria de personas y grupos"lo que comento aqu es mi experiencia"que desarrollan conjuntamente una fuente del conocimiento humano. "debian/rules"Sus trminos de uso permiten a cualquier persona navegador web, modificar"Soy notavo en paquetes deb"el contenido o pginas, por favor tenga presente que la informacin que encuentre"Soy novato en conferencias"no ha sido expertos profesionales que conozcan los temas"Se aceptan sugerencias de mejora"de las diferentes materias necesaria para proporcionar aqu y ahora"Ni de lejos una informacin completa, precisa y fiable" . 4. Manos a la obra... 5. Indice... </p> <ul><li><ul><li>Introduccin </li></ul></li></ul> <ul><li><ul><li>Qu es (un paquete deb) </li></ul></li></ul> <ul><li><ul><li>Cmo se genera(un paquete deb) </li></ul></li></ul> <ul><li><ul><li>Empaquetando Python </li></ul></li></ul> <ul><li><ul><li><ul><li>distutils/setup.py </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>Directorio debian </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>rules (CDBS/Debhelper) </li></ul></li></ul></li></ul> <ul><li><ul><li>A construir </li></ul></li></ul> <ul><li><ul><li>Conclusiones </li></ul></li></ul> <ul><li><ul><li>Ejemplos y demos </li></ul></li></ul> <ul><li><ul><li>Referencias </li></ul></li></ul> <p> 6. Introduccin: Contexto... </p> <ul><li><ul><li>Sistemas GNU/Linux </li></ul></li></ul> <ul><li><ul><li>Distros basadas en paquetes DEB (Debian, Ubuntu, etc) </li></ul></li></ul> <ul><li><ul><li>Distribucin / Deploy libreras y mdulos creados en Python </li></ul></li></ul> <p> 7. Introduccin: Por qu empaquetar... </p> <ul><li><ul><li>Control de dependencias </li></ul></li></ul> <ul><li><ul><li>Inventario de software </li></ul></li></ul> <ul><li><ul><li>Gestin comn soft de base (distro) y soft propio </li></ul></li></ul> <ul><li><ul><li>Instalador estandarizado </li></ul></li></ul> <ul><li><ul><li>Sistema de repositorios </li></ul></li></ul> <ul><li><ul><li>Utilidades (buscadores, ndices, etc...) </li></ul></li></ul> <ul><li><ul><li>Somos gente con estilo :) </li></ul></li></ul> <p> 8. Introduccin: Qu empaquetar... </p> <ul><li><ul><li>Software de base / infraestructura </li></ul></li></ul> <ul><li><ul><li>Versiones diferentes de software disponible en la distro usada (backports, nuevas versiones, etc...) </li></ul></li></ul> <ul><li><ul><li>Software de aplicacin y de libreras </li></ul></li></ul> <p> 9. Introduccin: Cunto cuesta empaquetar... </p> <ul><li><ul><li>Si es python y usa distutils (setup.py), casi nada </li></ul></li></ul> <ul><li><ul><li>Hacerlo para un paquete oficial de distro, bastante (cumplir la debian/policy) </li></ul></li></ul> <ul><li><ul><li>Hacerlo para nuestros paquetes, no tanto </li></ul></li></ul> <p> 10. Paquetes Deb Aplicaciones Python Manos a la obra 11. Qu es: Anatoma de un Deb I </p> <ul><li>Un fichero deb simplemente son tres ficheros unidos en uno slo mediante "ar". </li></ul> <ul><li>Ejemplo:</li></ul> <ul><li>ar -xv .deb</li></ul> <ul><li>x - debian-binary x - control.tar.gz x - data.tar.gz </li></ul> <p> 12. Qu es: Anatoma de un Deb II </p> <ul><li><ul><li>debian-binaryVersion del paquete deb (actualmente 2.0) </li></ul></li></ul> <ul><li><ul><li>control.tar.gz </li></ul></li></ul> <ul><li><ul><li><ul><li>./config </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>./preinst </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>./prerm </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>./conffiles </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>./md5sums </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>./control </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>.... </li></ul></li></ul></li></ul> <ul><li><ul><li>data.tar.gzFicheros incluidos en el paquete (binarios, librerias, etc...) </li></ul></li></ul> <p> 13. Cmo se genera: Herramientas I </p> <ul><li>Herramientas para contruir paquetes</li></ul> <ul><li><ul><li>python(incluye distutils) </li></ul></li></ul> <ul><li><ul><li>dpkg-dev / dpkg-buildpackage </li></ul></li></ul> <ul><li><ul><li>debhelperhelper programs for debian/rules </li></ul></li></ul> <ul><li><ul><li>fakerootGives a fake root environment </li></ul></li></ul> <ul><li><ul><li>cdbscommon build system for Debian packages </li></ul></li></ul> <ul><li><ul><li>dh-make tool that converts source archives into Debian package source </li></ul></li></ul> <p> 14. Cmo se genera: Creacin deb (app/lib Python) </p> <ul><li><ul><li>Partimos de fuentes con app/lib Python </li></ul></li></ul> <ul><li><ul><li>Verificamos/Creamos setup.py (distutils) </li></ul></li></ul> <ul><li><ul><li>Realizamos la debianizacin inicial </li></ul></li></ul> <ul><li><ul><li>Ponemos a punto: </li></ul></li></ul> <ul><li><ul><li><ul><li>debian/rules </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>debian/control </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>debian/changelog </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>debian/... </li></ul></li></ul></li></ul> <ul><li><ul><li>Construccin del paquete binario </li></ul></li></ul> <p> 15. Empaquetando python: setup.py (distutils) </p> <ul><li><ul><li>Buena prctica </li></ul></li></ul> <ul><li><ul><li>Solucin estndard (y recomendacin oficial de python) </li></ul></li></ul> <ul><li>Distribuye tu aplic/lib python con estilo </li></ul> <ul><li>http://docs.python.org/install/index.html </li></ul> <ul><li>http://docs.python.org/distutils/index.html </li></ul> <p> 16. Empaquetando python: setup.py (distutils) I </p> <ul><li>#!/usr/bin/env python </li></ul> <ul><li>from setuptools import * </li></ul> <ul><li>import aptdaemon </li></ul> <ul><li>setup(name="aptdaemon", </li></ul> <ul><li> ... </li></ul> <ul><li> packages=["aptdaemon"], </li></ul> <ul><li> scripts=["aptd", "aptdcon"], </li></ul> <ul><li> data_files=[("../etc/dbus-1/system.d/", </li></ul> <ul><li> ["data/org.debian.apt.conf"]), </li></ul> <ul><li> "doc/org.debian.apt.transaction.7"])], </li></ul> <ul><li> platforms = "posix") </li></ul> <p> 17. Empaquetando python: setup.py (distutils) II </p> <ul><li>distutils.core.setup( </li></ul> <ul><li> name='argparse', </li></ul> <ul><li> version=argparse.__version__, </li></ul> <ul><li> author='Steven Bethard', </li></ul> <ul><li> description='Python command-line parsing library', </li></ul> <ul><li> long_description = read_description(), </li></ul> <ul><li> license='Apache 2.0', </li></ul> <ul><li> classifiers=[ </li></ul> <ul><li> 'Topic :: Software Development', </li></ul> <ul><li> ... </li></ul> <ul><li> ], </li></ul> <ul><li> py_modules=['argparse'], </li></ul> <ul><li>) </li></ul> <p> 18. Empaquetando python: setup.py (distutils) III </p> <ul><li>#!/usr/bin/env python </li></ul> <ul><li>from distutils.core import setup </li></ul> <ul><li>import glob </li></ul> <ul><li>import os.path </li></ul> <ul><li>setup( </li></ul> <ul><li> name='Boscli-oss', </li></ul> <ul><li> ... </li></ul> <ul><li> package_dir = { '' : 'src' }, </li></ul> <ul><li> packages = ['boscli', ], </li></ul> <ul><li> scripts = ['src/bin/boscli', ], </li></ul> <ul><li> data_files = [ ( '/usr/lib/boscli/', </li></ul> <ul><li> glob.glob( 'src/lib/*.py') ) ], </li></ul> <ul><li>) </li></ul> <p> 19. Empaquetando python: setup.py (distutils) IV </p> <ul><li>#!/usr/bin/env python </li></ul> <ul><li>from distutils.core import setup </li></ul> <ul><li>setup(name = "amqplib", </li></ul> <ul><li> description = "AMQP Client Library", </li></ul> <ul><li> version = "0.6", </li></ul> <ul><li> license = "LGPL", </li></ul> <ul><li> author = "Barry Pederson", </li></ul> <ul><li> author_email = "bp@barryp.org", </li></ul> <ul><li> url = "http://barryp.org/software/py-amqplib/", </li></ul> <ul><li> packages = ['amqplib', 'amqplib.client_0_8'] </li></ul> <ul><li> ) </li></ul> <p> 20. Empaquetando python: Debianizacin inicial I </p> <ul><li><ul><li>Se crea el directorio debian: </li></ul></li></ul> <ul><li><ul><li><ul><li>Usando dh_make </li></ul></li></ul></li></ul> <ul><li><ul><li>Se adaptan ficheros del directorio debian </li></ul></li></ul> <ul><li>Si el cdigo es nuestro: </li></ul> <ul><li><ul><li>Si usamosdistutils / setup.pytenemos el95%del trabajo hecho. </li></ul></li></ul> <p> 21. Empaquetando python: Debianizacin inicial II </p> <ul><li>dh_make [options] -c, --copyright </li></ul> <ul><li>-e, --email </li></ul> <ul><li>-f, --file </li></ul> <ul><li>-r, --createorig </li></ul> <ul><li>-s, --single / -i, --indep / -m, --multi / ... -b, --cdbs </li></ul> <ul><li>-p, --packagename </li></ul> <ul><li>... </li></ul> <p> 22. Empaquetando python: Debianizacin inicial III </p> <ul><li>Opciones tpicas: </li></ul> <ul><li><ul><li>dh_make -r -f ../.tar.gz -p _ -s </li></ul></li></ul> <ul><li><ul><li>dh_make -r -f ../.tar.gz -p _ --cdbs </li></ul></li></ul> <p> 23. Empaquetando python: Debianizacin inicial IV </p> <ul><li>El directorio debian creado con dh_make contiene los siguientes ficheros:</li></ul> <ul><li>debian/ control debian/ changelog </li></ul> <ul><li>debian/ rules debian/docs debian/compat debian/copyright debian/*.ex y debian/*.EX </li></ul> <ul><li>debian/README.* </li></ul> <p> 24. Empaquetando python: Fichero Control I </p> <ul><li>Source: python-amqplib </li></ul> <ul><li>Section: bif </li></ul> <ul><li>Priority: extra </li></ul> <ul><li>Build-Depends:python-support(&gt;= 0.6),debhelper (&gt;= 5) </li></ul> <ul><li>Maintainer: Eduardo Ferro </li></ul> <ul><li>Package: python-amqplib </li></ul> <ul><li>Architecture: all </li></ul> <ul><li>Depends:${python:Depends} </li></ul> <ul><li>Provides:${python:Provides} </li></ul> <ul><li>Description: amqplib support </li></ul> <ul><li> amqplib support </li></ul> <ul><li> . </li></ul> <p> 25. Empaquetando python: Fichero Control II </p> <ul><li>Source: gnupginterface </li></ul> <ul><li>Section: python </li></ul> <ul><li>Priority: optional </li></ul> <ul><li>Maintainer: ... </li></ul> <ul><li>Build-Depends:cdbs ,debhelper(&gt;= 5.0.37.1),python,python-support </li></ul> <ul><li>Package: python-gnupginterface </li></ul> <ul><li>Architecture: all </li></ul> <ul><li>Depends:${python:Depends} , gnupg (&gt;= 1.2.1) </li></ul> <ul><li>Provides:${python:Provides} </li></ul> <ul><li>Description: Python interface to GnuPG (GPG) </li></ul> <ul><li> ... </li></ul> <p> 26. Empaquetando python: Fichero Changelog I </p> <ul><li><ul><li>Contiene versiones y descripcin de los cambios. </li></ul></li></ul> <ul><li><ul><li>Tiene formato definido y se crean entradas condch(devscripts) </li></ul></li></ul> <ul><li>Formato de cada cambio:</li></ul> <ul><li>[nombre] ([version]) [distro]; urgency=[nivel urg] </li></ul> <ul><li> * [descripcin cambio] -- [nombre] [fecha modificacin] </li></ul> <p> 27. Empaquetando python: Fichero Rules I </p> <ul><li><ul><li>aka " La madre del cordero " </li></ul></li></ul> <ul><li><ul><li>Se suelen general con el dh_make </li></ul></li></ul> <ul><li><ul><li>Se suelen hacer con dos estilos: </li></ul></li></ul> <ul><li><ul><li><ul><li>Usando dh_* (debhelpers) </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>Usando cdbs </li></ul></li></ul></li></ul> <ul><li><ul><li>Adems para python: </li></ul></li></ul> <ul><li><ul><li><ul><li>dh_python2 (recomendado / muy reciente) </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>python-support / dh_pysupport (+) </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>python-central / dh_pycentral </li></ul></li></ul></li></ul> <p> 28. Empaquetando python: Fichero Rules II </p> <ul><li><ul><li>Makefile que dirige la construccin del paquete deb </li></ul></li></ul> <ul><li><ul><li>Tiene diversos objetivos: </li></ul></li></ul> <ul><li><ul><li><ul><li>clean </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>binary </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>binary-arch </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>binary-indep </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>build </li></ul></li></ul></li></ul> <p> 29. Empaquetando python: Fichero Rules III python-support /dh_pysupport </p> <ul><li><ul><li>${python:Depends} </li></ul></li></ul> <ul><li><ul><li>${python:Versions} </li></ul></li></ul> <ul><li><ul><li>${python:Provides} </li></ul></li></ul> <ul><li><ul><li>Usa debian/pyversion Ej: 2.5- 2.5,2.6 </li></ul></li></ul> <ul><li><ul><li>Crea scripts compilacin y registro mdulos </li></ul></li></ul> <p> 30. Empaquetando python: Fichero Rules(dh I) </p> <ul><li>Existen gran cantidad de "helpers" para realizar cada una de las tareas necesarias en el rules.... </li></ul> <ul><li>dh_builddeb, dh_clean, dh_compress, dh_fixperms, dh_gencontrol, dh_install,dh_installchangelogs, dh_installcron, dh_installdeb, dh_installdebconf, dh_installdirs, dh_installdocs, dh_installemacsen, dh_installexamples, dh_installinfo ...</li></ul> <p> 31. Empaquetando python: Fichero Rules (dh II) </p> <ul><li>#!/usr/bin/make -f </li></ul> <ul><li>export DH_PYCENTRAL=include-links </li></ul> <ul><li>%: </li></ul> <ul><li>dh --with=python-central $@ </li></ul> <ul><li>override_dh_auto_clean: </li></ul> <ul><li>dh_auto_clean </li></ul> <ul><li>rm -rf build *.egg-info po/aptdaemon.pot </li></ul> <p> 32. Empaquetando python: Fichero Rules (dh III) </p> <ul><li>#!/usr/bin/make -f </li></ul> <ul><li>configure: configure-stamp </li></ul> <ul><li>configure-stamp: </li></ul> <ul><li>dh_testdir </li></ul> <ul><li>touch configure-stamp </li></ul> <ul><li>build: build-stamp </li></ul> <ul><li>python setup.py build </li></ul> <ul><li>... </li></ul> <ul><li>install: build </li></ul> <ul><li>dh_testdir </li></ul> <ul><li>dh_clean -k </li></ul> <ul><li>python setup.py install --root=$(CURDIR)/debian/python-amqplib </li></ul> <ul><li>... </li></ul> <p> 33. Empaquetando python: Fichero Rules (cdbs I) </p> <ul><li>Estilo CDBS : </li></ul> <ul><li><ul><li>Intenta simplificar el debian/rules </li></ul></li></ul> <ul><li><ul><li>Puede gestionar sin esfuerzo los casos tpicos ms comunes </li></ul></li></ul> <ul><li><ul><li>Intenta eliminar tareas repetitivas realizadas en los debian/rules </li></ul></li></ul> <ul><li><ul><li>Usa clases (extensibles), que son como partes de Makefile especializadas </li></ul></li></ul> <ul><li><ul><li>Estas clases estn bien probadas </li></ul></li></ul> <p> 34. Empaquetando python: Fichero Rules (cdbs II) </p> <ul><li>#!/usr/bin/make -f </li></ul> <ul><li>DEB_PYTHON_SYSTEM = pysupport </li></ul> <ul><li>DEB_PYTHON_COMPILE_VERSION = $(shell pyversions -vd 2&gt;/dev/null) </li></ul> <ul><li>include /usr/share/cdbs/1/rules/debhelper.mk </li></ul> <ul><li>include /usr/share/cdbs/1/class/python-distutils.mk </li></ul> <ul><li>include /usr/share/cdbs/1/rules/utils.mk </li></ul> <p> 35. Empaquetando python: Fichero Rules (cdbs III) </p> <ul><li>#!/usr/bin/make -f </li></ul> <ul><li># -*- mode: makefile; coding: utf-8 -*- </li></ul> <ul><li>DEB_PYTHON_SYSTEM=pysupport </li></ul> <ul><li>include /usr/share/cdbs/1/rules/debhelper.mk </li></ul> <ul><li>include /usr/share/cdbs/1/rules/simple-patchsys.mk </li></ul> <ul><li>include /usr/share/cdbs/1/class/python-distutils.mk </li></ul> <ul><li>build/python-gnupginterface:: </li></ul> <ul><li>pydoc -w ./GnuPGInterface.py </li></ul> <ul><li>clean:: </li></ul> <ul><li>-rm *.pyc *.html </li></ul> <p> 36. Empaquetando python: Fichero Rules (cdbs IV) </p> <ul><li>#!/usr/bin/make -f include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/makefile.mk # Add here any variable or target overrides you need. DEB_MAKE_CLEAN_TARGET = clean DEB_MAKE_BUILD_TARGET = all DEB_MAKE_INSTALL_TARGET = install DESTDIR=$(CURDIR)/debian/lsm/ # no check for this software DEB_MAKE_CHECK_TARGET = </li></ul> <p> 37. Empaquetando python: Otros ficheros en debian/ </p> <ul><li><ul><li> maintainer scripts: </li></ul></li></ul> <ul><li><ul><li><ul><li>prerm </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>postrm </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>preinst </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>postinst </li></ul></li></ul></li></ul> <ul><li><ul><li>.1 (manpage) </li></ul></li></ul> <ul><li><ul><li>.cron.*</li></ul></li></ul> <ul><li><ul><li>.init.* </li></ul></li></ul> <ul><li><ul><li>menu (entrada para menus grficos) </li></ul></li></ul> <ul><li><ul><li>compat </li></ul></li></ul> <ul><li><ul><li>...</li></ul></li></ul> <p> 38. A construir... 39. Construccin I </p> <ul><li>Recordemos: </li></ul> <ul><li><ul><li>Directorio de fuentes(con setup.py) </li></ul></li></ul> <ul><li><ul><li>Directorio debian </li></ul></li></ul> <ul><li><ul><li><ul><li>debian/control </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>debian/rules </li></ul></li></ul></li></ul> <ul><li><ul><li><ul><li>debian/changelog </li></ul></li></ul></li></ul> <ul><li> En el directorio debian suele haber muchos ms ficheros, pero los indicados son los mnimos...</li></ul> <p> 40. Construccin II </p> <ul><li>cd dir-paquete </li></ul> <ul><li>dpkg-buildpackage -us -uc -rfakeroot -sa </li></ul> <ul><li>-us, -uces para indicar que no queremos firmar el paquete ni los fuentes.</li></ul> <ul><li>-rfakerootes para que se construya simulando que somos root (usar un directorio interno) </li></ul> <ul><li>-sapara que genere los ficheros de paquete fuente </li></ul> <p> 41. Construccin III </p> <ul><li>Si queremos probar alguno de los targets del debian/rules podemos ejecutar: </li></ul> <ul><li>fakeroot debian/rules binary </li></ul> <ul><li>fakeroot debian/rules build</li></ul> <ul><li>fakeroot debian/rules clean </li></ul> <p> 42. Conclusiones: </p> <ul><li><ul><li>En GNU/linux, empaquetar es lo normal </li></ul></li></ul> <ul><li><ul><li>Usa distutils / setup .py tu vida ser mejor </li></ul></li></ul> <ul><li><ul><li>Debs oficiales requiere esfuerzo </li></ul></li></ul> <ul><li><ul><li>Debs para consumo propio muy fcil </li></ul></li></ul> <p> 43. Ejemplos y Demos 44. Referencias I: Empaquetamiento Deb Python </p> <ul><li>Debian Python Policy </li></ul> <ul><li>http://www.debian.org/doc/packaging-manuals/python-policy/ </li></ul> <ul><li>Debian Python FAQ </li></ul> <ul><li>http://wiki.debian.org/Python/FAQ </li></ul> <ul><li>Ubuntu Python Packaging Guide </li></ul> <ul><li>https://wiki.ubuntu.com/PackagingGuide/Python </li></ul> <p> 45. Referencias II: Generales Empaquetamiento Deb </p> <ul><li>Gua del nuevo desarrollador de Debian </li></ul> <ul><li>http://www.debian.org/doc/manuals/maint-guide/index.es.html </li></ul> <ul><li>Debian Policy </li></ul> <ul><li>http://www.debian.org/doc/debian-policy/index.html </li></ul> <ul><li>Ubuntu Packaging Guide </li></ul> <ul><li>https://wiki.ubuntu.com/PackagingGuide </li></ul> <ul><li>Manuales del DDP para desarrolladores </li></ul> <ul><li>http://www.debian.org/doc/devel-manuals.es.html </li></ul> <ul><li>CDBS Documentation</li></ul> <ul><li>http://cdbs-doc.duckcorp.org/en/cdbs-doc.xhtml </li></ul> <p> 46. Game Over!!! </p> <ul><li>Hasta aqu hemos llegado </li></ul> <ul><li>Preguntas? </li></ul> <ul><li>Sugerencias? </li></ul> <ul><li>Quejas? </li></ul> <ul><li>Insultos? </li></ul> <ul><li>... </li></ul> <ul><li>Eduardo Ferro </li></ul> <ul><li>[email_address] </li></ul>