Aggiornare un modulo senza rompere i negozi: script di upgrade e versionamento
L'installazione pulita la provano tutti; l'aggiornamento dalla versione di un anno fa, quasi nessuno. Ecco come evitiamo che una nuova versione rompa negozi che già funzionavano.
Quando provi un modulo, di solito lo installi in un negozio pulito. Ma i tuoi clienti non installano: aggiornano, a volte saltando cinque versioni. Se il percorso di aggiornamento non è curato, la nuova versione funziona sulla tua macchina e fallisce sulla loro.
Come decide PrestaShop cosa eseguire
Quando carichi una nuova versione, PrestaShop confronta la versione salvata nella tabella module con quella del codice ed esegue, in ordine, i file upgrade/upgrade-X.Y.Z.php la cui versione sta tra le due. Ognuno definisce una funzione:
function upgrade_module_1_4_0($module)
{
$db = Db::getInstance();
$existe = $db->executeS("SHOW COLUMNS FROM `" . _DB_PREFIX_ . "mimodulo` LIKE 'fecha_envio'");
if (!$existe) {
$db->execute("ALTER TABLE `" . _DB_PREFIX_ . "mimodulo` ADD `fecha_envio` DATETIME NULL");
}
return $module->registerHook('actionOrderStatusPostUpdate');
}
Le quattro regole
- Idempotenti. Uno script può essere eseguito due volte (un aggiornamento interrotto, una reinstallazione). Controlla prima di creare: colonne, indici, schede, configurazioni.
- Tutto ciò che è nuovo, anche nell'upgrade. Hook, schede, tabelle e valori di configurazione che aggiungi in
install()devono avere il loro gemello in uno script di upgrade, altrimenti i negozi vecchi non li avranno mai. - Non cancellare mai i dati del cliente. Se una colonna è di troppo, lasciala o rinominala; non eliminarla in un upgrade. E attenzione a disinstallare per reinstallare: ci sono moduli che cancellano tutte le loro tabelle quando vengono disinstallati.
- Restituisci davvero true o false. Se l'upgrade fallisce e restituisci
true, PrestaShop segna la versione come applicata e non ci riproverà.
install() e un upgrade successivo la ricreava senza controllare. Doctrine si aspetta una riga e ne trova due.Versionamento semantico
- Patch (1.4.1): correzioni senza modifiche ai dati.
- Minore (1.5.0): nuove funzionalità retrocompatibili, con il loro script di upgrade.
- Maggiore (2.0.0): modifiche che richiedono di rivedere la configurazione o che abbandonano versioni di PrestaShop o PHP.
Come lo testiamo
Installiamo la versione precedente pubblicata in un negozio di test, la configuriamo con dati simili a quelli di un cliente e aggiorniamo con il nuovo ZIP dal gestore dei moduli, esattamente come farà il cliente. Solo dopo proviamo l'installazione pulita. Sembra più lento; in realtà è ciò che ci risparmia le segnalazioni del lunedì mattina.