Ein Modul aktualisieren, ohne Shops zu beschädigen: Upgrade-Skripte und Versionierung
Die saubere Installation testet jeder; das Update von der Version vor einem Jahr fast niemand. So verhindern wir, dass eine neue Version Shops beschädigt, die bisher liefen.
Wenn Sie ein Modul testen, installieren Sie es meist in einem sauberen Shop. Aber Ihre Kunden installieren nicht: Sie aktualisieren, manchmal über fünf Versionen hinweg. Wenn der Update-Pfad nicht gepflegt ist, läuft die neue Version auf Ihrem Rechner und scheitert auf dem des Kunden.
Wie PrestaShop entscheidet, was ausgeführt wird
Beim Hochladen einer neuen Version vergleicht PrestaShop die in der Tabelle module gespeicherte Version mit der des Codes und führt der Reihe nach die Dateien upgrade/upgrade-X.Y.Z.php aus, deren Version dazwischen liegt. Jede definiert eine Funktion:
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');
}
Die vier Regeln
- Idempotent. Ein Skript kann zweimal laufen (ein unterbrochenes Update, eine Neuinstallation). Prüfen Sie vor dem Anlegen: Spalten, Indizes, Tabs, Konfigurationen.
- Alles Neue auch im Upgrade. Hooks, Tabs, Tabellen und Konfigurationswerte, die Sie in
install()hinzufügen, brauchen ihr Gegenstück in einem Upgrade-Skript, sonst bekommen alte Shops sie nie. - Löschen Sie nie Kundendaten. Wenn eine Spalte überflüssig ist, lassen Sie sie oder benennen Sie sie um; entfernen Sie sie nicht in einem Upgrade. Und Vorsicht beim Deinstallieren zum Neuinstallieren: Manche Module löschen beim Deinstallieren alle ihre Tabellen.
- Geben Sie wirklich true oder false zurück. Wenn das Upgrade fehlschlägt und Sie
truezurückgeben, markiert PrestaShop die Version als angewendet und versucht es nicht noch einmal.
install() anlegte und ein späteres Upgrade ihn ohne Prüfung erneut anlegte. Doctrine erwartet eine Zeile und findet zwei.Semantische Versionierung
- Patch (1.4.1): Korrekturen ohne Datenänderungen.
- Minor (1.5.0): neue, abwärtskompatible Funktionen, mit ihrem Upgrade-Skript.
- Major (2.0.0): Änderungen, die eine Überprüfung der Konfiguration erfordern oder PrestaShop- bzw. PHP-Versionen aufgeben.
Wie wir es testen
Wir installieren die zuvor veröffentlichte Version in einem Testshop, konfigurieren sie mit Daten, die denen eines Kunden ähneln, und aktualisieren mit dem neuen ZIP über die Modulverwaltung, genau so, wie es der Kunde tun wird. Erst danach testen wir die saubere Installation. Das wirkt langsamer; in Wirklichkeit erspart es uns die Störungen am Montagmorgen.