Usando módulos incompatibles en versiones mayores de Drupal

Escritorio con macbook air, magic mouse, airpods y otros elementos extra.

Cuando estamos realizando una actualización de una version mayor de Drupal a otra (por ejemplo, de la versión 9 a la 10), en ocasiones nos encontramos con módulos que podrían ser compatibles únicamente cambiando la version requerida en el archivo info.yml, pero nos encontramos con el problema de que Composer no nos permite actualizar para después aplicar un parche que cambie ese requisito. Pues es un problema común y vamos a ver cómo solucionarlo.

Lo primero que hay que tener en cuenta es que este método sirve para poder instalar módulos compatibles con Drupal 9 en Drupal 10 (en este caso, también para 8 a 9 y en el futuro del 10 al 11). Lo segundo es que tiene que existir un parche para que el módulo funcione en la nueva version mayor, ya sea un parche de la comunidad o uno creado por nosotros.

¿Porque tenemos este problema?

Esto se debe a como se gestionan las versiones de los módulos y que no siempre la comunidad tiene tiempo para actualizar los módulos a la version más reciente, de modo que en el info file no se indica que el módulo es compatible con la nueva versión mayor en "core_version_requirements":

name: My Module 
type: module 
core_version_requirement: ^8.8 || ^9 
dependencies: 
  - ctools:ctools

 Y con esa información Drupal genera una metadata para composer como la siguiente:

{
    "type": "drupal-module",
    "name": "drupal/my_module",
    "require": {
      "drupal/core": "^8.8 || ^9",
      "drupal/ctools": "*"
    }
  }

De modo que si estamos en Drupal 10 pero composer ve en la metadata que el módulo es compatible con la 8.8 o superior y Drupal 9, pero no con la version 10. Y esto es lo que nos impide que podamos descargar el módulo o actualizar a la próxima version mayor.

Drupal Lenient

Aqui es donde entra Drupal Lenient, un plugin de Composer desarrollado por Matt Glaman, y es que con este plugin podemos añadir los módulos que necesitemos, aunque no sean compatibles, eso sí, tendremos que añadirlos a una lista y también un parche para que sea compatible.

Lo primero que tenemos que hacer una pequeña configuración para cambiar la estabilidad minima requerida y es requerir el paquete:

$ composer config minimum-stability dev
$ composer require mglaman/composer-drupal-lenient

Una vez echo eso, ya podemos añadir los módulos que necesitemos a la lista de permitidos, para esto tenemos dos opciones, la primera es con un comando:

$ composer config --merge --json extra.drupal-lenient.allowed-list '["drupal/token"]'

En ese ejemplo estamos añadiendo el modulo "token" a la lista de los permitidos. La otra opción es hacerlo manualmente, para ello tendremos que modificar la opcion "drupal-lenient" dentro de las opciones extra de composer. Una vez echo todo, tendremos que añadir el parche necesario (necesitamos el paquete de composer "cweagans/composer-patches" para poder añadirlos) y listo, ya podremos actualizar lo que necesitemos.

Lo siguiente es un ejemplo de como podria verse el archivo composer.json, fijaros en las opciones dentro de la seccion "extra":

{
 "name": "vendor/project",
 "repositories": [
   {
     "type": "composer",
     "url": "https://packages.drupal.org/8"
   }
 ],
 "require": {
   "drupal/core": "^10.0.0",
   "drupal/my_module": "1.x-dev",
   "cweagans/composer-patches": "^1.7.3",
   "mglaman/composer-drupal-lenient": "^1.0.3"
 },
 "extra": {
   "composer-exit-on-patch-failure": true,
   "drupal-lenient": {
     "allowed-list": [
       "drupal/my_module"
     ]
   },
   "patches": {
     "drupal/my_module": {
       "3289029: Automated Drupal 10 compatibility fixes": "https://www.drupal.org/files/issues/2022-06-16/my_module.1.x-dev.rector.patch"
     }
   },
   "patchLevel": {
     "drupal/core": "-p2"
   },
 }
}

Conclusiones y consejos 

Y no hay mucho más, si necesitamos hacer esto con módulos de la comunidad, esto es lo que necesitamos hacer. Como podemos ver es mucho más sencillo de lo que parece. 

Cuando uséis este sistema, recordad que lo tenéis añadido y deberíais comprobar periódicamente si existen actualizaciones para ir eliminando los parches y los módulos de la lista de permitidos. Además, este debería ser el último recurso, siempre es mejor esperar un par de meses o incluso a la X.1.0 para actualizar, de esa manera nos ahorraremos problemas y tener que añadir complejidad al proyecto con acciones como esta.

Comparte este artículo:
Publicado por Borja
Image

Me metí en la aventura de Drupal con la versión 6, y aquí estoy, 10 años después, escribiendo articulos y haciendo videos sobre Drupal, quien me lo iba a decir. Aunque he probado otros framworks y cms, me quedo con Drupal de lejos, pero Symfony y Django estan entre mis favoritos. Aficionado a la montaña, la bicicleta, y el comer, de eso que no falte.