Softwareentwicklung

Was beim Deinstallieren eines Plugins verloren geht

Deaktivieren ändert ein einziges Feld. Deinstallieren löscht die Plugin-Konfiguration, eigene Entitäten — und Custom Fields, in denen Händlerdaten stehen. Der destruktive Weg ist der Standard.

Pixup MediaVeröffentlicht am 8 Min. Lesezeit

„Das Plugin brauchen wir nicht mehr." Danach folgt in vielen Projekten ein Klick, und ein paar Wochen später fehlen Daten, von denen niemand wusste, dass sie am Plugin hingen. Wir haben nachgemessen, was die beiden Wege tatsächlich tun.

Deaktivieren: ein Feld

Ein Plugin in einer laufenden Installation deaktiviert, den Bestand vorher und nachher verglichen:

vorhernachher
Tabellen in der Datenbank275275
aktive Plugins98
Einträge in system_config167167
Produkte1818

Nichts wurde entfernt. Die Tabellen des Plugins stehen weiter, seine Konfiguration steht weiter, seine Daten stehen weiter. Geändert hat sich das Feld active.

Ein deaktiviertes Plugin ist also ein Plugin im Ruhezustand — es greift nicht mehr ein, aber alles ist da. Wieder einschalten stellt den Zustand her.

Deinstallieren: fünf Löschschritte

Der Ablauf im Kern ist eindeutig, und die Reihenfolge ist aufschlussreich:

public function uninstallPlugin(
    PluginEntity $plugin,
    Context $shopwareContext,
    bool $keepUserData = false   // <- Voreinstellung
): UninstallContext {

Danach passiert, sofern keepUserData nicht gesetzt ist:

Schrittwas entfernt wird
1die Assets des Bundles — unabhängig von keepUserData
2die Migrationen des Plugins
3uninstall() des Plugins — im Kern kommentiert als „will remove the tables etc of the plugin"
4die gesamte Plugin-Konfiguration aus system_config
5Custom Entities und Custom Fields des Plugins

Dazu, falls das Plugin es deklariert, ein composer remove.

Der Schritt, der wirklich wehtut

Schritt 5.

Custom Entities sind Plugindaten — dass sie mitgehen, ist konsequent.

Custom Fields sind es nicht. Ein Plugin legt ein Feld an, ein Mitarbeiter pflegt über Monate Werte hinein, und beim Deinstallieren verschwindet beides: die Felddefinition und die Inhalte. Das sind Daten, die niemand als „Plugindaten" wahrnimmt — sie stehen an Produkten, an Kunden, an Bestellungen.

Wer wissen will, wie groß das Risiko im eigenen Shop ist, zählt vor dem Deinstallieren die Custom Fields des Plugins und die Zahl der Datensätze, die einen Wert darin haben. Das ist eine SQL-Abfrage und die einzige, die vor dieser Entscheidung wirklich zählt.

Die Voreinstellung ist die gefährliche

bool $keepUserData = false — der Standard ist der destruktive Weg. Auf der Kommandozeile:

--keep-user-data    Keep user data of the plugin

Eine Option, die man aktiv angeben muss. Wer sie nicht kennt, deinstalliert vollständig.

Bemerkenswert ist der Kommentar an Schritt 2. Die Migrationen werden vor dem eigentlichen Deinstallieren entfernt, „so we can recover in case of errors by rerunning the migrations". Das ist eine Fehlerbehandlung für einen abgebrochenen Vorgang — und keine Rückgängig-Funktion für einen erfolgreich abgeschlossenen.

Die Entscheidung

SituationWeg
Plugin macht Probleme, Ursache unklarDeaktivieren. Reversibel, sofort, ohne Datenverlust
Plugin wird ersetzt, Daten sollen übernommen werdenDeaktivieren, Daten migrieren, danach deinstallieren
Plugin war ein Versuch, nie produktiv genutztDeinstallieren — vorher trotzdem nachsehen, ob Custom Fields existieren
Shop wird aufgeräumt, Plugin seit Jahren ausDeinstallieren mit --keep-user-data, wenn Unsicherheit besteht. Der Preis sind ein paar verwaiste Tabellen
Lizenz läuft aus, Plugin muss wegSicherung, dann deinstallieren. In dieser Reihenfolge

Die praktische Regel ist einfach: Deaktivieren ist eine Entscheidung, Deinstallieren ist ein Vorgang. Die Entscheidung darf man revidieren, den Vorgang nicht.

Grenzen dieser Messung

Das Deaktivieren wurde an einer laufenden Installation durchgeführt und der Bestand vorher und nachher gezählt. Der Deinstallationsweg wurde im Kern gelesen, nicht an einem Plugin mit eigenen Tabellen und Custom Fields durchgespielt — dafür hätte ein Testsystem mit gepflegten Daten aufgebaut werden müssen.

Was ein einzelnes Plugin in seiner eigenen uninstall()-Methode tut, bestimmt das Plugin. Der Kern ruft sie auf; was darin steht, kann von Hersteller zu Hersteller abweichen. Diese Messung beschreibt den Rahmen, nicht jeden Inhalt.

Häufige Fragen

Was ist der Unterschied zwischen deaktivieren und deinstallieren?
Deaktivieren setzt ein Flag und lässt alle Daten stehen. Deinstallieren entfernt die Tabellen, die Konfiguration, die Custom Entities und die Custom Fields des Plugins — sofern man nicht ausdrücklich widerspricht.
Was macht --keep-user-data?
Es verhindert drei Löschschritte: das Entfernen der Migrationen, das Verwerfen der Plugin-Konfiguration und das Löschen von Custom Entities und Custom Fields. Die Option ist nicht voreingestellt, sie muss angegeben werden.
Verliere ich Produktdaten?
Die Kerndaten nicht. Aber Custom Fields, die das Plugin angelegt hat, werden mitsamt Inhalten entfernt — und in denen stehen oft gepflegte Händlerdaten, etwa Zusatzattribute an Produkten.
Kann ich das rückgängig machen?
Nur aus einer Sicherung. Der Kern entfernt die Migrationen absichtlich vor dem eigentlichen Deinstallieren, damit sich ein abgebrochener Vorgang durch erneutes Ausführen der Migrationen reparieren lässt — das ist eine Fehlerbehandlung, kein Rückgängigmachen.
WeiterführendShopware-Support