Una de las mejoras que trajo consigo el hecho de usar symfony, en la nueva versión de drupal 8 || 9, fué sin duda el uso de composer para gestionar nuestras dependencias.

Pero composer no sirve únicamente para gestionar dependencias, la realidad es que sirve para bastantes cosas más, y una de ellas, la cual uso bastante a menudo es, la gestión de parches dentro de nuestro proyecto.

Si has trabajado con drupal alguna vez, seguro que te habrás encontrado situaciones en las que existen bugs, tanto en los plugins que utilizas como en el core y que muchos de esos bugs están ya corregidos mediante un parche en alguna de las incidencias de drupal.org.

Estos parches, en versiones antiguas, eran bastante complejos de manejar, sobre todo si tenías que estar constantemente actualizando el plugin o el core.

Pero esto cambia en las ultimas versiones y hoy vamos a ver como fácilmente podemos gestionar estos parches mediante composer.

En busca del fallo

Obviamente, el primer paso es identificar nuestro problema y el segundo buscar una solución y por experiencia sé que generalmente eso que encontrastes ya está solucionado en algún sitio.

Como normal general cuando entrar en un módulo cualquiera o incluso el core, hay una apartado de «issues» en donde encontraremos una lista de incidencias que han abierto otros desarrolladores.

lista issues drupal core
Lista issues drupal core

Como podéis ver en la imagen anterior, en ocasiones hay una larga lista, esta lista, es usada para poder buscar problemas y soluciones a los posibles bugs que podamos ir encontrando.

Si entrasemos en alguna de esas incidencias, nos daremos cuenta que existen una gran variedad de comentarios y entre ellos algún que otro archivo, como imágenes o incluso parches.

Para este ejemplo vamos a usar un parche que soluciona un problema al listar paragraph en el backend. (https://www.drupal.org/project/drupal/issues/3092181).

Si entramos en la incidencia y bajamos, veremos las posibles soluciones e incluso comentarios de otros desarrolladores, estos comentarios son muy importantes porque nos dirán si realmente el parche funciona.

He elegido este parche en concreto porque tiene un caso curioso que me gustaría enseñaros y es que si os dais cuenta, han creado un parche para la versión de drupal 8 y otro para drupal 9.

Esto es importante tenerlo en cuenta a la hora de aplicar vuestro parche, debéis siempre aplicar el parche de la versión concreta en la que os encontréis. (https://www.drupal.org/files/issues/2020-12-08/3092181-142-8X_0.patch).

También, resalté los parches que nos interesan aplicar según nuestra versión de drupal, en nuestro ejemplo será el de drupal 8.

Vamos a parchear!

Ahora que ya tenemos claro que parche queremos incluir en nuestro proyecto, nos dirigiremos al archivo «composer.json» que encontraremos en la raíz de nuestro proyecto y lo abriremos con nuestro editor.

Una vez abierto, veremos una cantidad de lineas, en realidad es la definición de nuestro proyecto en composer. 

Haremos scroll hacia abajo hasta que encontremos lo siguiente:

[...]
"extra": {
        "drupal-scaffold": {
            "locations": {
                "web-root": "web/"
            }
        },
[...] 

Aquí añadiremos las siguientes líneas:

"enable-patching": true, #<-- Definimos que queremos activar el parching
"patches": { 
    "drupal/core": { #<-- Definimos el plugin donde se aplicara el parche 
        "Nested Paragraphs create multiple drag handles":"https://www.drupal.org/files/issues/2020-12-08/3092181-142-8X_0.patch" #<-- Anadimos el parche
    }
}, 

Debería quedar algo asi:

[...]
"extra": {
        "enable-patching": true,
        "patches": {
            "drupal/core": {
               "Nested Paragraphs create multiple drag handles":"https://www.drupal.org/files/issues/2020-12-08/3092181-142-8X_0.patch"
            }
        },
        "drupal-scaffold": {
            "locations": {
                "web-root": "web/"
            }
        },
[...] 

Es importante tener en cuenta un pequeño dato, a modo de «estandarización» a la hora de añadir un parche, este debe tener un formato específico:

‘nombre_de_la_incidencia’:’enlace_al_parche’

Este paso es bastante importante de cara a que cuando se aplique el parche sepamos el porqué lo estábamos usando. También, ayudará a futuros programadores a entender el motivo del parche.

Una vez añadida la línea correctamente al composer.json, guardamos y ejecutamos el siguiente comando desde la línea de comandos:

composer install 

Y ahora, composer, empezará a instalar de nuevo el plugin/core que estamos intentando parchear y aplicará automáticamente nuestro parche.

Si todo ha ido bien, podremos ver un mensaje de que nuestro parche se ha aplicado correctamente.

[...]  
  - Applying patches for drupal/core
    https://www.drupal.org/files/issues/2020-12-08/3092181-142-8X_0.patch (Nested Paragraphs create multiple drag handles)
[...] 

¿El parche no se aplica?

Hay muchos motivos por los cuales tu parche no se está aplicando correctamente, pero os voy a dar los tres más comunes que me he encontrado hasta ahora.

1 .- Comprueba que el nombre del plugin es correcto, vigila que no haya algo error ortográfico y sobretodo asegurate que tiene este formato:

drupal/nombre_del_plugin

2 .- Asegurate que tienes instalada la dependencia «cweagans/composer-patches», para ello ejecuta el siguiente comando «Este es las mas comun»:

composer require cweagans/composer-patches 

3 .- Verifica la versión en la que estás aplicando, en ocasiones me he encontrado que los parches no quedan claros y lo he intentado aplicar en versiones erróneas, así que vuelve a revisar si el parche es válido para tu version.

Conclusión

La verdad que esta nueva forma de gestionar los parches se me hace mucho más amena y fácil de administrar, sobre todo en un cms que requiere de actualizaciones constantes.

Como habéis podido ver es tremendamente sencillo añadir nuestro parche y además nos permite, entre otras muchas cosas, el garantizar que todo aquel que trabaje en nuestro proyecto tenga siempre aplicado el parche que necesitamos para que el proyecto funcione como queremos.