Com aplicar un patch a Drupal amb Composer

El món de la programació està en evolució constant, i Drupal no és una excepció. I passa, de vegades, que el algun punt del codi apareixen bugs o problemes que impedeixen el seu correcte funcionament. És aquí on la gran comunitat que hi ha al darrere de Drupal té una gran rellevància: reportant aquests problemes i oferint i proposant esmenes a les pàgines de issues de cada projecte.
Coneixent les pàgines d'issues
I això com es fa? Per norma general, quan algú es troba amb un bug o problema de funcionament d'un mòdul, pot reportar-ne la seva existència a l'apartat d'issues del mòdul.
En aquest agafarem com a exemple el mòdul de la comunitat Token. Com podeu veure a la imatge de sota, teniu la secció d'issues a la columna de la dreta:

Si algú creu tenir la solució al problema o bug reportat, pot pujar un pedaç de codi amb l'esmena al fil de comentaris de la issue. Aquesta possible solució es comentada per la comunitat d'usuaris i inclús pot ser millorada per la resta, fins arribar entre tots a una solució definitiva.

És per això que és una bona pràxi revisar les issues d'un mòdul o projecte si mai ens trobem amb un problema de funcionament. I és que pot ser que hagi estat solucionada però encara no hagi estat publicada oficialment a una nova release o versió del mòdul. D'això se'n diu un patch, un pedaç de codi encara no ofical però que soluciona un problema existent. En aquest tutorial us ensenyarem com aplicar-los al vostre Drupal.
↑ Tornar a daltCom incloure un patch a Drupal
Primer de tot, cal afegir una dependència al vostre projecte, el qual farem amb Composer:
composer require cweagans/composer-patches
Un cop afegida la dependència anterior, haureu d'obrir el vostre fitxer composer.json
i localitzar la part del codi on es defineix la clau extra: {}
, quedant l'estructura de la següent manera:
"extra": {
"enable-patching": true,
"patches": {
"drupal/token": {
"Patch title <url of the issue#comment>": "<patch file url>"
}
}
}
El primer que haurem de fer és habilitar el patches al nostre lloc. Això és fa incloent la linia: "enable-patching": true,
. Després d'això, ja podrem incloure tants patches com siguin necessaris, separats per comes.
Anem a veure ara les parts d'un patch amb un exemple real per veure'n més a detall el seu funcionament:
"extra": {
"enable-patching": true,
"patches": {
"drupal/token": {
"Unexpected empty blocks <https://www.drupal.org/project/token/issues/3306574#comment-14671745>": "https://www.drupal.org/files/issues/2022-08-29/token-css-standard-3306574-5.patch"
}
}
}
- A la línia 4 definim el
project/module
al qual s'aplicarà el patch. - A la línia 5 el que farem serà copiar el títol de la pàgina de la issue, seguit de la url del comentari on s'ha publicat el patch. Això ho farem servir com a key de l'objecte, dins de l'estructura del JSON. D'aquesta manera tindrem ben visible l'origen del patch i una mica de contexte sobre el problema que es pretén solucionar.
- Com a darrer pas, també a la línia 5, definirem el value de l'objecte amb la url del propi patch. Generalment és una url que acaba en ".patch".
Aplicació del patch amb Composer
Amb tot això definit, només ens cal aplicar el patch amb Composer. Simplement executeu la següent comanda a l'arrel del vostre projecte, abans de la carpeta que conté la instal·lació del vostre Drupal:
composer install
↑ Tornar a dalt
Com aplicar un patch creat localment
Si després de cercar una solució al vostre problema no heu trobat res a les pàgines d'issues del mòdul en qüestió, podeu animar-vos i crear el vostre propi patch (això seria mereixedor d'un altre article 😜), emmagatzemant-lo de manera local al vostre projecte. Dit això, val a dir que també pot ser una bona forma de testejar el vostre patch abans de publicar-lo a la pàgina d'issues.
En aquest cas el que farem serà crear un carpeta anomenada patches
a l'arrel del nostre projecte, fora de la carpeta contenidora del Drupal. Ho podem fer amb una senzilla comanda a la terminal:
mkdir patches
Pel que fa a tot l'esmentat anteriorment, no canvia quasi bé res: només la url del vostre patch, el qual ara serà una ruta relativa. A continuació us mostrem un exemple genèric:
"extra": {
"enable-patching": true,
"patches": {
"drupal/token": {
"Unexpected empty blocks": "patches/unexpected-empty-blocks.patch"
}
}
}
I, com sempre, no oblideu d'aplicar el patch, amb Composer:
composer install
↑ Tornar a dalt
Conclusions
Això seria tot pel que fa a l'aplicació de patches a Drupal amb Composer. Senzill, veritat? Certament, el procés a Drupal 8, 9 o 10 és força més aclaridor que no pas a com era a Drupal 7.
Sobretot l'avantatge més evident és que tot queda declarat al vostre arxiu composer.json
, de manera que hom sempre es pot consultar si al lloc web se li ha aplicat un patch, què és el que fa i on localitzar-lo per veure si el problema s'ha solucionat o no en una nova release del mòdul o projecte.
En aquest, sentit i com a darrera recomanació, és força assenyat anar revisant regularment la pàgina de la issue per veure si el maintainer del mòdul ha validat la solució i l'ha afegit en una nova versió. En aquest cas, el patch ja no seria necessari i, per tant, l'hauríeu d'eliminar del vostre composer.json
i executar composer install
novament. D'aquí el seu caràcter temporal, com podeu veure.
Deixa el teu comentari