Replicación de proyectos Python

¿Qué es zc.buildout?

Es una herramienta que replica todo un entorno de trabajo aislado. Esto es una buena práctica para experimentar con código y el estar familiarizado con estas herramientas será beneficioso para desarrollar e implantar aplicaciones.

Características

Estas son sus principales características:

  • Basado en Python, es una utilidad escrita en el lenguaje de programación Python, esto le permite agregar nuevas extensiones vía módulos a la herramienta.

  • Sintaxis declarativa, permite definición de configuraciones buildout de forma declarativa, basada en el formato .INI de Windows, es decir, clave = valor, haciendo esto una ventaja a las otras herramientas de auto-construcción de proyectos ya que su sintaxis es de fácil entendimiento ya que esta es un lenguaje de configuración de alto nivel.

    ; last modified 1 April 2001 by John Doe
    [owner]
    name = John Doe
    organization = Acme Widgets Inc.
    
    [database]
    ; use IP address in case network name resolution is not working
    server = 192.0.2.62
    port = 143
    file = "payroll.dat"
    

    Este sistema de auto-construcción es súper sencillo de escribir esta basado en la configuraciones de archivo .ini de Windows, es decir, clave =  valor mas adicionalmente ofrece el concepto de los recetas te permite usar tareas predefinidas para construir un servidor Zope, instalar un servidor de MySQL o PostgreSQL, o instalando lenguaje de programación como Python, PHP en fin.

  • Facilita el día a día del trabajo, Orientado al programador y administradores de sistemas.

  • Se puede replicar, eso quiere decir que puedes configurar que instalar, y como configurar cosas en tu proyecto con la finalidad de agilizar el despliegue de proyectos en entornos de desarrollo, pruebas y producción.

  • Integración con sistema de paquetes, es fácil trabajar con los formatos de paquetes Egg.

¿Por que usar zc.buildout?

Para entender por que es de utilidad zc.buildout hay que conocer las cosas que conllevaron a su creación de herramienta hace unos años atrás la instalación de aplicaciones en Python que tenias muchas dependencias era un dolor de cabeza ya que tenia que instalar manualmente las dependencias en tu sistema para poder iniciar la instalación de tu aplicación, entonces la solución en ese momento fue crear un paquete de tipo bundle el cual consistía en un archivo comprimido con todos los módulos que son necesario compilar o instalar en el PYTHONPATH de tu interprete python.

Ventajas:

  • En su momento no existía paquetes Egg ni mecanismos de solución de dependencias y esto facilitaba la solución de dependencias necesarias para su instalación.

Desventajas:

  • Era casi imposible actualizar las librerías prácticamente tenias dos opciones: primero aplicabas parches a las librerías o segundo hacer una instalación que incluya los parches de seguridad y mueves la data hacia allá.

Entonces paulatinamente la comunidad de Zope le fue natural que crearan un sistema de auto-construcción como Makefile o Apache Ant pero basado en Python que le ayuda a reconstruir sus instalaciones, entonces para esto crearon Buildout.

En ejemplo típico de Plone en entornos de producción no solo es Plone, sino un cacheo de contenidos, balanceo de cargas, motor de plantillas, servidor Web y todo esto se puede construir con Buildout.

Hasta puedes usar buildout para construir una instalación LAMP en este caso un ejemplo de como instalar Wordpress.

Desde la adopción de Plone de buildout se ha simplificado la instalaciones de Plone y se ha creado todo un sistema de replicación de entornos de trabajos al cual puedes acceder actualizaciones de módulos Python de forma mas sencilla a nivel administrativo.

Progresivamente fue natural que buildout implementara soporte a paquetes Egg, esto impulsado por la fundación Python como una norma de crear aplicaciones que puedan ser distribuidas baja su filosofía de módulos y paquetes. Esto causo que Zope siendo un paquete bundle se separa en muchos paquetes Egg y fue algo natural que Plone también ;)

“Buildout, es un Makefile con esteroides” -Francisco Palm.

Terminología

Hay que entender varios conceptos antes de continuar tales como buildout, part y recipe.

Instalación

Puedes instalar zc.buildout usando pip (es recomendable hacerlo dentro de un entorno virtual):

$ pip install zc.buildout

Funcionamiento

La herramienta zc.buildout funciona en base a los siguientes pasos ilustrados e descritos a continuación:

Como instalar Paquetes Egg Python
  1. Las configuraciones se efectúan en el archivo buildout.cfg.
  2. Luego de editar sus configuraciones ejecute el comando bin/buildout.
  3. Entonces zc.buildout consulta dentro Python Package Index para comprobar la existencia del paquetes a descargar.
  4. Descarga los paquetes Egg (archivos .egg / .tar.gz) y sus dependencias que estén publicados en PyPI.
  5. Finalmente se encarga de instalar en el PYTHONPATH el(los) paquete(s) para estar disponible desde una consola interactiva Python o para ser usado en sus códigos fuentes Python.

Configuraciones genéricas

Usted puede agregar las configuraciones genéricas para todos sus proyectos Buildout, para esto debe ejecutar los siguientes comando:

$ mkdir $HOME/.buildout ; mkdir $HOME/.buildout/{downloads,eggs,extends,zope}
$ nano $HOME/.buildout/default.cfg

Luego de crear el archivo default.cfg defina algunas configuraciones de usuario predeterminadas para cualquier parte de su configuración buildout:

[buildout]
download-cache = /ruta/absoluta/al/home/del/usuario/.buildout/downloads
eggs-directory = /ruta/absoluta/al/home/del/usuario/.buildout/eggs
extends-cache = /ruta/absoluta/al/home/del/usuario/.buildout/extends
zope-directory = /ruta/absoluta/al/home/del/usuario/.buildout/zope

Nota

Esto solamente proveerá valores predeterminados, ¡éstos no sobrescribirán las configuraciones en su configuraciones buildout!

Creación de proyectos buildout

Ahora crea una nueva configuración zc.buildout así:

$ mkdir mibuildout ; cd mibuildout
$ buildout init

Ahora el nuevo directorio mibuildout es un proyecto buildout.

El archivo de configuración predeterminado del buildout es buildout.cfg. Después de inicializar, tendrá el siguiente contenido:

[buildout]
parts =

Puedes cambiarlo a:

[buildout]

parts = py

[py]
recipe = zc.recipe.egg
interpreter = python
eggs = zope.component

Ahora ejecuta el comando buildout disponible dentro del directorio mibuildout/bin sin ningún argumento. Esto creará un nuevo interprete Python dentro del directorio mibuildout/bin:

$ ./bin/buildout

Esto creará un nuevo intérprete Python dentro del directorio mibuildout/bin:

$ ./bin/python

Y luego tendrá a disposición en su PYTHONPATH el paquete que instalo zope.component, como se demuestra a continuación:

>>> import zope.component

Utilizando zc.buildout con la recipe llamado zc.recipe.egg se puede crear un intérprete python con los paquetes Egg especificados.

Este comando ejecutará un intérprete de python que puedes usar para ejecutar el código de su proyecto.

Descarga código fuente

Para descargar el código fuente de este ejemplo ejecute el siguiente comando:

$ git clone https://github.com/plone-ve/buildout.basic.git

Conclusiones

Este ejemplo intenta mostrar las capacidades del zc.buildout con el interprete python de su entorno de desarrollo.

los comentarios son proporcionados por Disqus

Editar este documento

El código fuente de este archivo esta hospedado en GitHub. Todos pueden actualizar y corregir errores en este documento con unos clic - sin necesidad de descargar.

  1. Vaya hacia el articulo Replicación de proyectos Python en GitHub.
  2. Presione el botón Fork. Este creara su propia copia personal de la documentación.
  3. Edite los archivos usando el editor de texto de GitHub desde su navegador Web
  4. Rellene en la caja de texto Commit message al final de la pagina indicando por que usted realizo estos cambios. Presione el botón Propose file change próximo a ese cuando haya finalizado.
  5. Luego diríjase a la página Send a pull request (no será necesario rellenar ningún texto adicional). Sólo tiene que pulsar el botón Send pull request.
  6. Sus cambios serán consultados por un revisor dentro de la pestaña Pull requests del proyecto en Github.

Para mas información básica acerca de como actualizar este manual y referencia a sintaxis Sphinx, por favor consulte la guía Escribiendo y actualizando el manual.