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

La majoria de projectes en drupal que hem creat des de communia requereixen un manteniment, i quan creix la quantitat de projectes a mantenir es necessita una estratègia per poder fer actuacions en massa com poden ser les instal·lacions de mòduls o llibreries, actualitzacions, neteja de caches o registres per monitoritzar.

Fins la versió 8, drush permetia crear àlies i agrupar-los per fer actuacions per grup. Per exemple es podia fer un grup @autoup que permetia actualitzar els drupals que se sabia que en principi no tenien cap motiu per donar errors en la actualització.

Tot això ha entrat en revisió amb Drupal 8, en el moment en què drupal passa a seguir l’estratègia d’innovació oberta que permet la inclusió de codi no dissenyat especificament per drupal, també conegut com estratègia d’innovació Proudly Found Elsewhere(symfony, easyrdf, doctrine, twig...). Per orquestrar totes les dependències es fa via composer, i concretament a partir de drupal 8 es recomana instal·lar una estructura (scaffolding).

Això ens dóna aquests canvis en l’estructura del projecte:

Drupal 7 structure vs Drupal 8 (with drupal-composer) structure

En la qual on realment es gestionen les dependències és una carpeta per sobre de la de web, és en la carpeta arrel de drupal-project on executarem composer per instal·lar dependències.

Tots aquests canvis impliquen una nova perspectiva per gestionar el projecte, ja no podem basar-nos en drush, i de fet la versió de drush 9.x ja ens adverteix que instal·lar mòduls per drush està abandonat.

Com que no he trobat una eina per gestionar múltiples projectes de composer, he creat l’aplicació de consola druman amb el component de symfony console command. Així es pot fer una gestió dels projectes siguin basats en drush, o en composer.

Druman gestor de projectes en drupal

Aquest programa es basa en una llista definida en yml que estarà a ~/.druman-aliases.yml, on definim algunes propietats per cada projecte: alias, path, groups, manager.

Hi ha un exemple d’un yml a la carpeta examples:

  • alias: serà el nom amb el qual indexarem i podrem accedir al projecte.

  • Path: és la ruta del projecte, si fem servir l’estructura drupal-composer hem de donar l’arrel del projecte (no la de la web). En cas que no fem servir l’estructura drupal-composer hem de posar l’arrel de web. En cas que vulguem un alias remot hem de posar "".

  • Groups: llista de grups als que pertany el projecte, per exemple autoup si volem fer un grup d’autoactualització o hacked si volem llistar projectes en els quals hem de parar especial atenció a l’hora d’actualitzar o instal·lar mòduls. (es pot posar els noms que vulguin, els que hi han posats a l'exemple són d’exemple).

  • Manager: Quin gestor farem servir per controlar dependències:

    • drush8 Serà útil per la comanda projects:update (sense ús en comanda projects:run), fa servir el gestor drush (v8) per actualitzar seguint el procediment estandar de drupal 7(no recomenat per drupal 8).

    • drupal-composer Serà útil per la comanda projects:update (sense ús en comanda projects:run), fa servir el gestor composer per procedir amb l'actualització en estructures drupal-composer.

    • drush8-alias Serà útil quan s'actualitza (amb la comanda projects:update) i quan es criden comandes de drush (via comanda projects:run). Indicar el gestor drush8-alias és la via per mantenir un site remot(o local) definit en els àlies de drush, enlloc de reinventar la lògica dels àlies remots de drush, he optat per reaprofitar-ho. Els àlies seran tractats sense canviar al directori de projecte(ja que no està definit path) ni fent un canvi d'usuari, es fa tal com ho fan els àlies de drush(amb els possibles problemes de permisos posteriors que poden sorgir). A l'hora de fer una crida d'una comanda sempre afegirà drush @alias, per tan els àlies de drush i de druman han de coincidir, i s'haura de dir tan sols la comanda de drush, per exemple:
       

      druman project:run -a project_x status

       

Gestió de projectes (només drupal 7) remots.

Hem de parar especial atenció que si en un projecte fem servir el manager drush8-alias, per gestionar projectes remots primer haurem de definir l’àlies remot tal com es feia sempre amb drush fins la versió 8. Això és així per no haver de re-escriure la lògica que fa servir drush per connectar a remots (Per afegir un àlies a drush hi ha informació a : https://raw.githubusercontent.com/drush-ops/drush/8.x/examples/example.aliases.drushrc.php ). Així caldrà definir l’àlies a ~/.drush/aliases.drushrc.php i a ~/.druman-aliases.yml, potser en un futur això canvia per poder tirar composers en remot.

 

Si definim un projecte gestionat per drush8-alias el path s’haurà de posar en blanc

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

Llistar projectes

Per volcar la llista de projectes podem fer servir:

druman projects:list

 

Per tal de filtrar la llista per grup o per origen(local o remot), aquesta ordre permet les següents opcions:

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.

 

Executant comandes a l’arrel dels projectes

A partir del llistat de projectes definits a .druman-aliases.yml podem realitzar operacions. Podem tirar una ordre a l’arrel del projecte via:

projects:run

Tindrem les mateixes opcions de filtratge que quan llistem i a més a més l’opció de seleccionar un únic alies directament. Les opcions són:

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

Arguments:
 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 

Abans d’executar la comanda ho farà havent canviat d’usuari al que sigui el propietari de la carpeta definida al path de l’àlies.

Executant actualitzacions dels projectes

Per actualitzar hi ha la comanda druman projects:update, que permet les mateixes opcions que la comanda 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 manera com actualitza els projectes gestionats per drush8-alias o drush8 segueix les ordres per actualitzar un drupal 7. La manera com actualitza els projectes gestionats per drupal-composer segueixen el procediment per actualitzar un drupal 8. Es pot veure els procediments a https://github.com/aleixq/druman/blob/master/src/Command/ManagerRunnerProjectsCommand.php .

Què queda pendent:

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.