Cómo instalar un módulo no compatible con Drupal 11

Tutoriales
reading time 20

Vamos a ver como utilizar el plugin creado por Matt Glaman (Lenient Composer Plugin) para usar un módulo contrib que aun no esta listo para D11.

Para eso supongamos que tenemos un Drupal 11 instalado, la versión 11.1.1 para ser más específicos.

Ahora supongamos que necesitamos instalar el módulo Mobile detect, que actualmente no tiene su versión para D11.

 

Primero intentamos instalar el modulo como lo haríamos siempre:

ddev composer require 'drupal/mobile_detect:^3.0'

Y claramente composer nos avisa que hay problemas:

 

Your requirements could not be resolved to an installable set of packages.
  Problem 1
    - Root composer.json requires drupal/mobile_detect ^3.0 -> satisfiable by drupal/mobile_detect[3.0.0, ..., 3.0.6].
    - drupal/mobile_detect[3.0.0, ..., 3.0.1] require drupal/core ^8 || ^9 -> found drupal/core[8.0.0, ..., 8.9.20, 9.0.0, ..., 9.5.11] but the package is fixed to 11.1.1 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
    - drupal/mobile_detect[3.0.3, ..., 3.0.6] require drupal/core ^8 || ^9 || ^10 -> found drupal/core[8.0.0, ..., 8.9.20, 9.0.0, ..., 9.5.11, 10.0.0, ..., 10.4.1] but the package is fixed to 11.1.1 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.
Installation failed, reverting ./composer.json and ./composer.lock to their original content.
Composer [require drupal/mobile_detect:^3.0] failed, composer command failed: exit status 2. stderr=

 

Bien, ahora vamos a ver como solucionar esta situación

Instalamos el plugin anteriormente mencionado

ddev composer require mglaman/composer-drupal-lenient

Y tambien instalamos el instalador de parches para Drupal 

ddev composer require cweagans/composer-patches

 

Luego de haber instalado todo lo necesario comenzamos con el parcheo del módulo que necesitamos instalar, en nuestro caso Mobile Detect

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

Esto agregara al composer.json lo siguiente:

"drupal-lenient": {
   "allowed-list": ["drupal/mobile_detect"]
}

 

Ahora agregamos el parche en la sección correspondiente en el composer.json

"patches": {
   "drupal/mobile_detect": {
       "Automated Drupal 11 compatibility fixes for mobile_detect": "https://www.drupal.org/files/issues/2024-03-24/mobile_detect.3.0.6.rector.patch"
   }
},

 

Puede que se pregunten de dónde salió ese parche, como es que lo encontramos. Bueno si van a la página oficial de drupal donde esta el modulo, podrán ver que en el apartado de issues seguramente encuentren el parche, en el caso de mobile detect sería así:

En la pagina del módulo entramos a la sección de issues

img4

Luego buscamos todo lo referido a Drupal 11

img5

Si lo encontramos entonces podemos acceder a ver si esta el patch dentro de la issue

imagen

OBS: Si no encuentras o no existe aún un rector file, no te preocupes, al final de este post muestro como generar un parche localmente para el módulo y así poder usar el proceso completo de parcheo que estamos viendo.

Se adjunta una imagen para que puedas ver donde se pone esto si es el primer parche que vas a agregar

img1

 

Con esto ya deberíamos poder instalar el módulo, vamos a probarlo:

ddev composer require 'drupal/mobile_detect:^3.0'
ddev composer update drupal/mobile_detect
ddev drush en -y mobile_detect

Si vamos al codigo del modulo podemos ver el .info que ya tiene ahora la compatibilidad con D11

img3

 

Y como vemos en nuestro Drupal ya está instalado el módulo y listo para ser usado

img2

 

Extra extra… vamos a construir nuestro propio parche local para los casos en los que no exista aún el parche dentro del módulo. Vale aclarar que el parche es solo para la compatibilidad en el .info pero se podrían agregar más cambios en el caso que detectemos alguna parte problemática en el código del módulo.

 

Un caso de ejemplo sería el módulo Image Field Caption del cual todavía no tiene versión para D11 y tampoco tiene generado el rector patch para el .info file

 

Obviamente si probamos instalarlo en el D11 

composer require 'drupal/image_field_caption:^2.0'

nos saldrá el mismo error que en el ejemplo que hicimos más arriba

Your requirements could not be resolved to an installable set of packages.
  Problem 1
    - Root composer.json requires drupal/image_field_caption ^2.0 -> satisfiable by drupal/image_field_caption[2.0.1].
    - drupal/image_field_caption 2.0.1 requires drupal/core ^9 || ^10 -> found drupal/core[9.0.0, ..., 9.5.11, 10.0.0, ..., 10.4.1] but the package is fixed to 11.1.1 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.
Installation failed, reverting ./composer.json and ./composer.lock to their original content.
Composer [require drupal/image_field_caption:^2.0] failed, composer command failed: exit status 2. stderr=

 

Ahora si, vamos a crear el parche nosotros mismos:

 

En cualquier carpeta de nuestro sistema, clonamos el módulo en la versión que queremos instalar

Video AQUI

mkdir patch
git clone -b 2.0.1 https://git.drupalcode.org/project/image_field_caption.git
cd image_field_caption

Hacemos los cambios en el módulo, en nuestro caso solo agregamos al .info la versión de D11

imagen

 

Luego creamos el parche con el siguiente comando, el nombre puede ser cualquier pero seguimos la convencion del rector file que usa drupal nombreModulo.versionModulo.rector.patch

git diff 2.0.1 > image_field_caption.2.0.1.rector.patch

 

Esto nos creo el archivo en el mismo directorio

imagen

 

Ahora nos toca, si es que no lo tenemos previamente, crear el folder para los patch locales de drupal y poner dentro el rector file que acabamos de generar (image_field_caption.2.0.1.rector.patch):

 

imagen

 

Ahora incluimos el parche creado dentro del composer.json de la siguiente manera

imagen

Listo ahora probamos instalar el módulo como siempre lo hacemos

ddev composer config --merge --json extra.drupal-lenient.allowed-list '["drupal/image_field_caption"]'
ddev composer require 'drupal/image_field_caption:^2.0'
ddev composer update drupal/image_field_caption
ddev drush en -y image_field_caption