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:
- Descargar la versión requerida del repositorio (Pedir usuario, password y versión de ser necesario)
- Chequear que el módulo sea instalable (Tenga los archivos necesarios y se cumplan las dependencias)
- Si el módulo ya se encuentra instalado, se pregunta al usuario que curso de acción tomar.
- Ejecutar script pre_install del módulo.
- Guardar copias de los archivos existentes si son del mismo módulo.
- Informar si existe un archivo que no corresponde a otra version del modulo y será reemplazado.
- Instalar archivos nuevos.
- Guardar en la DB de modulos los datos del nuevo módulo con estado “instalando”
- Procesar el archivo schema.sql del módulo.
- Ejecutar script de post_install
- 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).
Es el eslogan del sitio
Estuve usando 
