• Gestión de proyectos con Buildout

last modified August 30, 2011 by macagua

­­Buildout

Buildout es una herramienta para administrar y organizar las partes de un desarrollo con Python.

¿Qué es buildout?

Una herramienta para administrar, a través de un archivo de configuración declaratoria, las partes y componentes de un desarrollo con Python. Dichas partes no están limitadas a componentes o código Python. La parte más poderosa de buildout es que puede extenderse con el uso de "recetas" que pueden instalar componentes más complicados simplemente agregando nuevas secciones a la configuración. Buildout puede instalar diversos paquetes de Python fácilmente porque está conectado con el índice de paquetes de Python.

¿Qué significa la palabra Buildout?

La palabra hace referencia a una descripción de un conjunto de partes y al software para crear y ensamblar esas partes. A menudo se usa informalmente para hacer referencia a un sistema instalado basado en la definición de un buildout. Por ejemplo, si estamos creando una aplicación llamada Foo, entonces el buildout de Foo será la colección de configuraciones y aplicaciones específicas que permiten crear una instancia de la aplicación. Informalmente podríamos referirnos a tal instancia como el buildout de Foo.

¿Qué es el zc.buildout?

zc.buildout es una herramienta que nos permite definir buildouts. Estas son sus principales características:

  • Permite definición de buildouts de forma declarativa.
  • Basado en Python.
  • Orientado a desarrollador.
  • Se puede replicar.
  • Es fácil trabajar con los formatos de paquetes eggs.

Casos de uso

Una de las características más importantes - y la razón por muchos miembros de la comunidad Python/Zope/Plone usan Buildout es por su replicabilidad. Con buildout usted es capaz de replicar de manera "casi exacta" la configuración de software que tienes en la máquina de desarrollo y en el servidor. Esto es una ventaja enorme, e incluso hay quienes, compilan su propio intérprete de Python usando buildout. Además, es una muy buena herramienta para hacerle despliegue a los proyectos de software. A continuación, hay algunos ejemplos:

  1. Diversas versiones de Python con zc.buildout, este buildout es una colección de configuraciones para hacer mas fácil la compilación de varias versiones de Python con o sin las dependencias necesariamente.­

  2. Instalando un repositorio espejo PyPI (con z3c.pypimirror) a través de Buidlout, este buildout describes como instalar su propio repositorio espejo del Python Package index (aka Cheese-Shop) usando buildout como para construcción del mismo.­

  3. El über-buildout de Martin Aspelli, este buildout ilustra una instalación de desarrollo y producción multi-plataforma, la cual instala y configura 2 instancias de Plone, un servido Web Nginx, un proxy reverso y acelerador HTTP como Varnish, un Servidor ZEO y un conjunto de configuraciones adicionales.
  4. Apache buildout, esta configuración instala en tu sistema a través de la compilación desde los archivos fuentes de­ Apache 2.2.15 y habilita y una serie de módulos o comportamientos de Proxy Server y SSL. Además instala Supervisor, que es un sistema para controlar los estados de procesos bajo UNIX, es un sistema cliente/servidor que permite a sus usuarios controlar un número de procesos e­n sistema operativos como basados en UNIX. 
  5. Nginx buildout, una instalación de Nginx y Supervisor con Buildout, el cual instala y configura a través de la compilación del código fuente de Nginx 0.7.65. 
  6. PostgreSQL buildout, una instalación de PostgreSQL impulsada a través de supervisor, el cual instala y configura a través de la compilación del código fuente de PostgreSQL 8.4.1. 
  7. MySQL buildout, una instalación de MySQL y Supervisor con Buildout, el cual instala y configura a través de la compilación del código fuente de MySQL 5.1.44.
  8. LAMP buildout,  este buildout crea un stack LAMP, adecuado para la implementación de muchas aplicaciones PHP, el cual instala y configura MySQL-5.1.40 (un servidor de base de datos), Apache 2.2.14 (un servidor Web), libgd 2.0.35, Php 5.2.11, Wordpress (Un blog), phpMyAdmin 3.1.3.2, Sugar Community Edition 5.2.0f (un CRM de código abierto), phorum 5.2.10 (un software para foros de discusión), Supervisor (una herramienta de supervisión de estados de procesos).
  9. Wordpress buildout, este es un buildout que descarga, y configura desde un instalador tarball de Wordpress, además instala un tema de Wordpress.

Recipes Buildout

Los récipes son los mecanismos de plugin proveídos por Buildout para agregar nuevas funcionalidades para construir su software. Una parte del Buildout es creado por un récipe. Los récipes son siempre instalado como un paquete eggs de Python. Ellos pueden ser descargados desde un servidor de paquetes, como el Python Package Index (PyPI) , otro ellos pueden ser desarrollados como parte de un proyecto usando un paquete egg de desarrollo.
Un paquete egg de desarrollo es un tipo especial de paquete egg que se instala como un vínculo de huevo que contiene el nombre de un directorio de origen. Los paquetes eggs de desarrollo no tienen que ser empaquetados para distribución para ser usados y se puede modificar en en sitio, lo cual es especialmente útil cuando se están desarrollando.

A continuación describo una serie de récipes útiles para la construcción de Python/Zope/Plone:

  • collective.recipe.plonesite, es un récipe buildout para crear y actualizar un sitio plone. Este récipe le permite habilitar de crear y actualizar un sitio Plone como parte de una ejecución buildout. Este récipe sólo tiene por objeto ejecutar perfiles y productos QuickInstall. Se supone que los métodos de instalación, setuphandlers, pasos de actualización, y otras recetas se encargará del resto del trabajo.
  • collective.recipe.backup, proporciona parámetros por defecto para las tareas de respaldo de datos comunes. El script ./bin/repozo es un script zope para hacer copias de seguridad de Data.fs.

  • plone.recipe.apache, es un récipe buildout para compilar, instalar un servidor Web Apache desde los archivos fuentes con la configuración adecuada.­
  • z3c.recipe.ldap, es un récipe buildout para desplegar una servidor OpenLDAP.

  • collective.recipe.updateplone, es un récipe buildout para actualizar sitios Plone.
  • ­zest.recipe.mysql, es un récipe buildout para definir una base de datos ­MySQL.
  • plone.recipe.command, es un récipe buildout para ejecutar instrucciones desde linea de comando arbitrariamente desde buildout.
  • ­mr.developer­, es una extensión de zc.buildout la cual hace fácil trabajar con buildouts que contiene muchos paquetes que contienen gran cantidad de paquetes de los cuales sólo desea desarrollar algunos.

Existe una lista de récipes buildout disponibles en los siguientes enlaces:

Esqueletos Buildout

Son una serie de colecciones de plantillas esqueletos que permiten iniciar rápidamente proyectos, existente diversos esqueletos orientados a tipos de desarrollos específicos, a continuación se muestran algunos esqueletos útiles: 
  • django-project-templates, plantillas Paster para crear proyectos Django.
    • fez.djangoskel, ­es una colección de plantillas Paster para crear aplicaciones Django como paquetes eggs.
    • django-harness, es una aplicación destinada a simplificar las tareas típicas relacionadas con la creación de un sitio web hechos con Django, el mantenimiento de varias instalaciones (local, producción, etc) y cuidando su instalación global y su estructura de "esqueleto" actualizado del sitio de manera facil.
    • lfc-skel, Plantillas Paster para django-lfc. lfc-skel provee una plantilla para crear una aplicación LFC.

  • Zope­Skel, es una colección de esqueletos para crear automáticamente paquetes e instancias en Zope.
    • zopeproject, Tools and scripts for creating development sandboxes for web applications that primarily use Zope.
  • grokcore.startup,  Soporte a Paster para proyectos Grok.
    • grokproject, Script that sets up a grok project directory, installs Zope 3 and grok and creates a template for a grok application.
  • Pylons,  un Framework Web Pylons, que al instalarse con Easy Install instala dos plantillas de proyectos Pylons.
    • PylonsTemplates, Plantillas extras de paster para Pylons, incluyendo implementación de repoze.what. PylonsTemplates le ofrece plantillas adicionales paster para aplicaciones Pylons.
    • BlastOff, Una plantilla de aplicación Pylons que proporciona un esqueleto de entorno de trabajo configurado con SQLAlchemy, mako, repoze.who, ToscaWidgets, TurboMail, WebFlash y (opcionalmente) SchemaBot. La aplicación genereda esta previamente configurada con autenticación, inicio de sesión y formularios de registro, y (opcionalmente) confirmación de correo electrónico. BlastOff ayudar a accelerar el desarrollo de aplicaciónes en Pylons por que genera un proyecto con una serie de dependencias configuraciones previamente.
  • CherryPaste, Usar CherryPy dentro Paste.
  • TracLegosScript, TracLegos es un software diseñado para ofrecer plantillas para proyectos trac y asiste con la creación de proyecto trac.
    • trac_project, Plantilla de proyecto Trac de software de código abierto.

Algunos términos importantes con relación a Buildout y Python

  • Paquete de Python. Básicamente, una carpeta con código Python que contiene un archivo __init__.py.
  • Huevo (Python egg). Un mecanismo para empaquetar y distribuir paquetes de Python.
  • Cheese shop (PYPI). Un repositorio de paquetes de Python.
  • easy_install. Un script de línea de comando que permite instalar a través de la red paquetes del PYPI.

Requisitos previos de Buildout y Python

Existen instrucciones detalladas para la instalación de requisitos, pero en general se necesita lo siguiente:

  • Python (Versión del interprete de Python)
  • Python Dev (los archivos de encabezados Python para las compilaciones necesarias).
  • Python profiler, Algunas distribuciones de Linux requieren el paquete python-profiler por separado. 
  • Python Setup Tools (Paquete que instala la herramienta de gestión de paquetes Easy Install necesaria para manipular paquetes eggs de Python "easy_install")
  • Libc (librerías de desarrollo y los archivos de encabezados Python).

Instalando dependencias en distribuciones basadas en Debian GNU/Linux

Para para distribuciones basadas en Debian GNU/Linux, debe instalar los requisitos previos con el siguiente comando:

# aptitude install python python-dev python-profiler python-setuptools python-virtualenv libc6-dev

Instalando entornos virtuales de Python locales al usuario

Para evitar usar la instalación base del Python de tu sistema, que previamente acaba de realizar, se recomienda instalar un entorno de virtual de Python local al usuario, algunos casos de usos para virtualenv, se describe a continuación:

  • No es necesarios permisos de administración para instalar librerías y aplicaciones Python, ya que estas se hace locales en al directorio del usuario.
  • Mayor comodidad de trabajar con versiones de librerías y aplicaciones mas actuales las que maneja tu sistema.

Instalar Virtualenv en su sistema, ejecute el siguiente comando:

# aptitude install python-virtualenv

Instalar Virtualenv en usuario local, ejecutando los siguientes comandos:

$ cd $HOME

$ mkdir ./virtualenv ; cd virtualenv

Crear entorno virtual del Python de tu sistema al directorio ~/virtualenv del usuario, ejecutando el siguiente comando: 

$ virtualenv python

Activar el entorno virtual creado previamente, ejecutando el siguiente comando:

$ source ./python/bin/activate

 Luego de activar el entorno virtual creado previamente, ejecutando el siguiente comando:

(python)usuario@pc:~/virtualenv$ easy_install PasteScript

No olvidar que estos paquetes han sido instalados con el entorno virtual que previamente usted activo, eso quiere decir que los paquetes previamente instalados con Easy Install están instalados en el directorio ~/virtualenv/python/lib/python4/site-packages/ en ves del directorio de su versión de Python de sistema /usr/lib/python2.x/site-packages/

Al finalizar la instalación podrá opcionalmente consultar cuales plantillas tiene disponible para usa, ejecutando el siguiente comando:

(python)usuario@pc:~/virtualenv$ paster create --list-templates
Available templates:
  basic_package:       A basic setuptools-enabled package
  paste_deploy:        A web application deployed through paste.deploy

Usted debe usar el comando paster para crear el proyecto Buildout.

(python)usuario@pc:~/virtualenv$ paster create -t basic_package my_basic_package

Selected and implied templates:

PasteScript#basic_package A basic setuptools-enabled package Variables: egg: my_basic_package package: my_basic_package project: my_basic_package Enter version (Version (like 0.1)) ['']: 0.1 Enter description (One-line description of the package) ['']: My Basic Package Enter long_description (Multi-line description (in reST)) ['']: My Basic Package to show how use PasteScript Enter keywords (Space-separated keywords/tags) ['']: PasteScript Basic Package Demo Enter author (Author name) ['']: Pedro Picapiedra Enter author_email (Author email) ['']: pedro@acme.com Enter url (URL of homepage) ['']: http://www.acme.com/equipo/pedro Enter license_name (License name) ['']: GPL Enter zip_safe (True/False: if the package can be distributed as a .zip file) [False]: Creating template basic_package Creating directory ./my_basic_package Recursing into +package+ Creating ./my_basic_package/my_basic_package/ Copying __init__.py to ./my_basic_package/my_basic_package/__init__.py Copying setup.cfg to ./my_basic_package/setup.cfg Copying setup.py_tmpl to ./my_basic_package/setup.py Running /home/macagua/virtualenv/python/bin/python setup.py egg_info

Usted puede verificar el paquete previamente creado y observará como este paquete básico ha habilitado el setuptools

(python)macagua@pc:~/virtualenv$ tree my_basic_package/
my_basic_package/
|-- my_basic_package
|   `-- __init__.py
|-- my_basic_package.egg-info
|   |-- PKG-INFO
|   |-- SOURCES.txt
|   |-- dependency_links.txt
|   |-- entry_points.txt
|   |-- not-zip-safe
|   `-- top_level.txt
|-- setup.cfg
`-- setup.py

Cuando termine de usar el entorno virtual puede desactivarlo de la siguiente forma:

(python)usuario@pc:~/virtualenv$ deactivate
De esta forma ya puedes realizar operaciones de shell fuera del entorno virtual.

Recomendaciones

  • Si desea trabajar con algún proyecto de desarrollo basado en esqueletos o plantillas paster y Buildout simplemente seleccione cual esqueleto va a utilizar para su desarrollo y proceso a instalarlo con Easy Install (como se explico anteriormente) y siga sus respectivas instrucciones para lograr con exito la tarea deseada.­

Buildout y Frameworks Web


Referencias

­