Managing multiple drupals (7 and 8, composer and drush)

La mayoría de proyectos en drupal que hemos creado desde communia requieren un mantenimiento, y cuando crece la cantidad de proyectos a mantener se necesita una estrategia para poder hacer actuaciones en masa como pueden ser las instalaciones de módulos o librerías, actualizaciones, limpieza de caches o registros para monitorizar.

Hasta la versión 8, drush permitía crear alias i agruparlos para realizar actuaciones por grupo. Por ejemplo se podía hacer un grupo @autoup que permitía actualizar Drupal que se sabía que en principio no tenían ningún motivo para dar errores en la actualización.

Todo ello ha entrado en revisión con Drupal 8, en el momento en que drupal pasa a seguir la estrategia de innovación abierta que permite la inclusión de código no diseñado específicamente para drupal, también conocido como estrategia de innovación Proudly Found Elsewhere (symfony, easyrdf, doctrine, TWIG ...).Para orquestar todas las dependencias se hace vía composer , y concretamente a partir de drupal 8 se recomienda instalar una estructura (scaffolding) .

 Esto nos da estos cambios en la estructura del proyecto:

Estructura de Drupal 7 vs Drupal(8) con drupal-composer

En la que donde realmente se gestionan las dependencias es una carpeta por encima de la de web, así es en la carpeta raíz de drupal-project donde ejecutaremos composer para instalar dependencias.

 

Todos estos cambios implican una nueva perspectiva para gestionar el proyecto, ya no podemos basarnos en drush, y de hecho la versión de drush 9.x ya nos advierte que instalar módulos con drush está abandonado.

Como no he encontrado una herramienta para gestionar múltiples proyectos de composer, he creado la aplicación de consola druman con el componente de symfony console command .Así se puede hacer una gestión de los proyectos sean basados en drush, o en composer.

Druman gestor de proyectos en drupal

Este programa se basa en una lista definida en yml que estará en ~ / .druman-aliases.yml, donde definimos algunas propiedades para cada proyecto: alias, path, groups, manager.

Hay un ejemplo de un yml en la carpeta examples:

  • alias: será el nombre con el que indexaremos, para poder acceder al proyecto.

  • Path: es la ruta del proyecto, si usamos la estructura drupal-composer debemos dar la raíz del proyecto (no la de la web). En caso de que no usamos la estructura drupal-composer debemos poner la raíz de web.

  • Groups: lista de grupos a los que pertenece el proyecto, por ejemplo autoup si queremos hacer un grupo de autoactualización o Hacked si queremos listar proyectos en los que debemos prestar especial atención a la hora de actualizar o instalar módulos. (Se puede poner los nombres que quieran, los que hay puestos son de ejemplo).

  • Manager: Qué gestor utilizaremos para controlar dependencias:

    • drush8 Será útil para el comando projects:update (sin uso en comando projects:run), utiliza el gestor drush (v8) para actualizar siguiendo el procedimiento estándar de drupal 7 (no recomendado para drupal 8).
    • drupal-composer Será útil para el comando projects:update (sin uso en comando projects:run), utiliza el gestor composer para proceder con la actualización en estructuras drupal-composer.
    • drush8-alias Será útil cuando se actualiza (con el comando projects:update) y cuando se llaman comandos de drush (vía comando projects: run).Indicar el gestor drush8-alias es la vía para mantener un site remoto (o local) definido en los alias de drush, en lugar de reinventar la lógica de los alias remotos de drush, he optado por reaprovechar ello. Los alias serán tratados sin cambiar el directorio de proyecto (ya que no está definido path) ni haciendo un cambio de usuario, se hace tal como lo hacen los alias de drush (con los posibles problemas de permisos posteriores que pueden surgir). A la hora de ejecutar una orden siempre añadirá
      drush @alias

      por tanto los alias de drush y de druman deben coincidir, y solo se tendrá que indicar el comando de drush no toda la orden, por ejemplo:

      druman project:run -a project_x status

      en lugar de drush status
       

Gestión de proyectos (sólo drupal 7) remotos.

Debemos prestar especial atención en que si en un proyecto utilizamos el manager drush8-alias, para gestionar proyectos remotos primero tendremos que definir el alias remoto tal como se hacía siempre con drush hasta la versión 8. Esto es así para no tener que re-escribir la lógica que utiliza drush para conectar a remotos (Para añadir un alias a drush hay información en: https://raw.githubusercontent.com/drush-ops/drush/8. x / examples / example.aliases.drushrc.php ).Así habrá que definir el alias en ~ / .drush / aliases.drushrc.php y en ~ / .druman-aliases.yml , quizás en un futuro esto cambia para poder tirar composers en remoto.

 

Si definimos un proyecto gestionado por drush8-alias el path deberá ponerse en blanco

alias: someexternal_com
path: ""
groups: hostingatx
manager: drush8-alias

Listar proyectos

Para volcar la lista de proyectos podemos utilizar:

druman projects:list 

Para filtrar la lista por grupo o por origen (local o remoto). Esta orden permite las siguientes opciones:

druman projects: list -h
Usage:
 projects: list [options]

Options:
-g, --group [= GROUP] List only projects of specified group
-l, --local List only local projects
-r, --remote List only remote projects
-f, --full Show all fields from list: alias, path, management type and group.

Ejecutando ordenes en la raíz de los proyectos

A partir del listado de proyectos definidos en .druman-aliases.yml podemos realizar operaciones. Podemos tirar una orden en la raíz del proyecto vía:

projects:run

Tendremos las mismas opciones de filtrado que el listado y además la opción de seleccionar un único alias directamente. Las opciones son:

druman projects:run -h
Usage:
 projects:run [options] [-] [<order>]

argumentos:
  order Command to run.

Options:
  -g, --group [= GROUP] Run only on these projects which are members of specified group
  -a, --alias [= ALIAS] Run only on this specific alias
  -l, --local List only local projects
  -r, --remote List only remote projects
  -all, --all Run in all alias, excluding those using drush8-alias manager, if specified no filters will be used

Antes de ejecutar el comando lo hará habiendo cambiado de usuario en el que sea el propietario de la carpeta definida en el path del alias.

Ejecutando actualizaciones de los proyectos

Para actualizar hay el comando

druman projects: update

que permite las mismas opciones que la orden projects:run.

projects:update -h
  -g, --group [= GROUP] Run only on these projects which are members of specified group
  -a, --alias [= ALIAS] Run only on this specific alias
  -l, --local List only local projects
  -r, --remote List only remote projects
  -all, --all Run in all alias, excluding those using drush8-alias manager

La forma en que actualiza los proyectos gestionados por drush8-alias o drush8 sigue las órdenes para actualizar un drupal 7.La forma en que actualiza los proyectos gestionados por drupal-composer siguen el procedimiento para actualizar un drupal 8. Se puede ver los procedimientos en https://github.com/aleixq/druman/blob/master/src/Command/ManagerRunnerProjectsCommand.php .

Qué queda pendiente:

Add new comment

The content of this field is kept private and will not be shown publicly.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.

Semantic linkbacks

This site uses semantic webmentions to interact between sites and build federated conversations.

Mentioned by: