Sistema de Módulos Para CakePHP (Parte 2) - Scripts de instalación

El objetivo de los scripts de instalación para el sistema de módulos para cakephp es automatizar el proceso de descarga, instalación, actualización y desinstalación de módulos en cakePHP.

Antes de seguir, veamos a que llamamos módulo.

Un módulo es un grupo de funcionalidades, agrupadas por alguna razón en especial. La idea es tener módulos para tareas que siempre usamos y queremos “tirar” dentro de un nuevo proyecto. Un módulo podría ser un sistema básico de usuarios, la expansión del mismo a un sistema de grupos y permisos más elaborado, una lista de email, páginas cms, etc, etc. Básicamente un paquete de funcionalidad que queremos agregar a un sitio.

Por que no usar plugins? Bueno, los módulos podrían ser plugins, ya que hasta ahora no hemos hablado de la estructura del módulo en si, podemos decir que el módulo, aparte de los archivos mencionados en el post anterior, puede contener cualquier archivo que necesite ser instalado en nuestro directorio APP. Con esto podemos tener módulos con controllers, models, views, y también con helpers, behaviors, components, vendors, imágenes, css, scripts, y casi cualquier cosa que nos imaginemos, sin el problema que representa copiar archivos de un proyecto a otro.

Teniendo en cuenta que la instalación, mantenimiento y desinstalación serán automáticas, el único problema que nos queda es que los archivos de distintos módulos no se solapen. A esto lo podemos lograr al tener ciudado y ser metódicos a la hora de crear los módulos, pero nuestro sistema también deberia avisarnos si un módulo que estemos por instalar sobreescribirá un archivo de otro módulo ya instalado, o cualquier archivo ya existente.

Resumiendo el proceso de instalación tenemos:

  1. Descargar la versión requerida del repositorio (Pedir usuario, password y versión de ser necesario)
  2. Chequear que el módulo sea instalable (Tenga los archivos necesarios y se cumplan las dependencias)
  3. Si el módulo ya se encuentra instalado, se pregunta al usuario que curso de acción tomar.
  4. Ejecutar script pre_install del módulo.
  5. Guardar copias de los archivos existentes si son del mismo módulo.
  6. Informar si existe un archivo que no corresponde a otra version del modulo y será reemplazado.
  7. Instalar archivos nuevos.
  8. Guardar en la DB de modulos los datos del nuevo módulo con estado “instalando”
  9. Procesar el archivo schema.sql del módulo.
  10. Ejecutar script de post_install
  11. Registrar el módulo como instalado.

Esta es la linea general a seguir por el script de instalación del módulo. Aspiramos a un script que se pueda usar de la siguiente forma

module-get install|update|uninstall <module-name> [version]

Y creo que en sin querer bautizé a mi script. La idea es usar el mismo script para las tres tareas, instalar, actualizar y desinstalar un módulo. El parámetro de versión seria opcional y si no está presente, el script instalará la ultima versión del módulo especificado.

Para terminar (por ahora), cabe aclarar que las operaciones de instalar, actualizar y desinstalar deberían ser “lo más atómicas posible”, es decir que si algo nos impide seguir con la instalación, este script debería poder dejar las cosas tal y como estaban antes de que comienze a hacer cambios (tanto en archivos como en db).

Sistema de Módulos Para CakePHP (Parte 1)

Hace bastante que vengo trabajando con cake, y una de sus mejores ventajas es la reusabilidad del código que uno hace. El único punto débil en este aspecto es la ausencia de un sistema bien organizado y modular.
Lo que planteo en este artículo es definir un sistema de módulos y una serie de scripts que instalen, configuren, y desinstalen automáticamente.


Antes de continuar, cabe aclarar que este post no plantea ser una solución definitiva, sino una idea que puede evolucionar con el tiempo en algo muy útil.

Dicho sistema debe ser de fácil mantenimiento y actualización. Inspirado en el sistema de paquetes de Debian, los módulos deben tener dependencias,scripts de pre y post instalación/desinstalación, auto configuración de la base de datos, y un sistema de registro que nos diga qué módulos están instalados y cuáles no.

Usaremos una base de datos sqlite, que se integrará al sistema cake sin problemas y podremos mantener la información de todos los módulos instalados.

La primera tabla que necesitamos es modules (hare todo en inglés para mantener la consistencia con el resto del sistema) cuya estructura es (o podría ser) la siguiente:
modules(id,codename,name,version,description,status)
Con esto podemos guardar datos sobre los módulos instalados o a medio instalar.

El directorio APP/conf me parece el lugar ideal para guardar los datos de los módulos, así, tendremos todo en APP/conf/modules, un archivo sqlite (modules.sqli) y subdirectorios con el nombre de cada módulo instalado.

Dentro de cada directorio de módulo tendríamos los siguientes archivos:

  • module_specs.php
  • db_schema.sql
  • install_scripts.php

El primero (module_specs.php) es el que indicará a nuestro script de instalación los detalles del módulo. Debe contener valores para las variables:

  • $name: opcional, el nombre del módulo. El default es el nombre del directorio.
  • $description: opcional, la descripción del módulo.
  • $depends: un array de nombres de módulo de los que éste depende.

El archivo db_schema.sql contiene las ordenes sql para crear la(s) tabla(s) necesaria(s) para el módulo. También puede contener datos iniciales para las mismas.

Este sería el esquema básico para el sistema de módulos para cakephp (hasta ahora podría usarse independientemente del framework).
En el próximo post describiré el proceso de instalación de módulos.

AJAXed with AWP