Bloc
Joan Galtés i Moreno

Com aplicar un patch a Drupal amb Composer

Com aplicar un patch a Drupal amb Composer
De vegades passa que un mòdul contribuït o el mateix core de Drupal presenta un problema que cal esmenar el més ràpid possible per tal de garantir el seu correcte funcionament. En aquest tutorial us mostrarem com aplicar un patch, una solució ràpida, al mateix temps que temporal, per solucionar aquest tipus d'incidències.

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.

↑ Tornar a dalt

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:

L'apartat d'issues es troba a la columna dreta de la pàgina de cada mòdul o projecte

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. 

Exemple de patches publicats a una pàgina d'issue del mòdul Token

É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 dalt

Com 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".
↑ Tornar a dalt

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.

↑ Tornar a dalt

Sobre l'autor/a

Joan Galtés i Moreno

Desenvolupador full-stack, especialitzat en Drupal des de 2008. M'agrada concebre i desenvolupar tant el back-end com el front-end en tots els meus projectes. Entusiasta de les noves tecnologies, amb un bon domini de PHP, MySQL, Git, Javascript, HTML 5, SASS i CSS 3, posant molt d'èmfasi en la usabilitat i l'accessibilitat de tot allò que desenvolupo.

Comparteix

Deixa el teu comentari