Prüfung der API-Versionen vor der Installation überdenken

  • App
    WoltLab Suite Core

    https://github.com/WoltLab/WCF/bl…s.php#L201-L218

    Aktuell wird jedes Paket erlaubt, das mindestens eine kompatible API-Version anführt. Die Prüfung sollte aber eigentlich genau anders herum funktionieren und abbrechen, sobald mindestens eine nicht kompatible API-Version aufgeführt ist.

    Beispiel:

    WSC 3.0 (2017): Ich nutze die Klasse wcf\data\foo\Foo

    WSC 3.1 (2018): Die genutzte Klasse wird deprecated und durch wcf\data\bar\foo\BarFoo ersetzt, ich kriege das nicht mit und setze 2018 dazu, wenn ich mal wieder ein Update veröffentliche. Oder ich denke mir, das Paket ist zu 2018 ja kompatibel und die Klasse kann ich nicht tauschen, weil ich WSC 3.0 und WSC 3.1 unterstützen will.

    WSC 5.2 (2019): Die genutzte Klasse wird (überraschend schnell) entfernt. Das WSC akzeptiert 2018 und 2019. Das Paket lässt sich installieren, obwohl eine API-Version nicht akzeptiert wird.

    Klar ist das in gewisser Weise ein Fehler bzw. eine Unachtsamkeit durch den Entwickler, aber irren ist menschlich. Ein praktisches Beispiel dazu wäre übrigens der IEventListener, der seinen Namespace tauschen soll und in der Zwischenzeit eine zweite Klasse existiert.

    Ich bin diesbezüglich gerade etwas zwiegespalten (und bräuchte den Algorithmus jetzt für eine Zuordnung zum WSC; da soll das Paket natürlich exakt gleich handeln wie das WSC bei der Installation). Daher... Was denkt ihr dazu?

  • Ich fürchte, hier liegt ein Missverständnis hinsichtlich des Konzeptes hinter den API-Versionen vor.

    Anders als die bisherige Herangehensweise, bei dem der Autor bei jeder neuen Version prüfen muss, ob das Plugin weiterhin lauffähig ist, drehen API-Versionen diese Prüfung um. Die API-Version ist ein Versprechen, dass ein Paket für API-Version X lauffähig ist, selbst wenn andere API-Versionen unterstützt werden. Das Beispiel trifft daher nicht zu, da ein WSC 5.2 die API-Versionen 2017, 2018 und 2019 offiziell unterstützt. Es handelt sich bei der Angabe somit streng genommen um eine API-Kompatibilität.

    Dieses Vorgehen hat für uns den Vorteil, dass wir zielgerichtet deprecated Funktionen entfernen können ohne pauschal mit der Kompatibilität aller Plugins zu brechen. Gleichzeitig vermeiden wir damit das lästige excludedpackage auf die jeweils nächste Funktion.

    Als Entwickler gibt man alle API-Versionen an, mit denen das Plugin uneingeschränkt lauffähig ist, der Core prüft dann, ob es eine Überschneidung mit den unterstützen Versionen gibt.

  • Alexander Ebert May 14, 2019 at 4:04 PM

    Added the Label Won’t be implemented
  • Das Beispiel trifft daher nicht zu, da ein WSC 5.2 die API-Versionen 2017, 2018 und 2019 offiziell unterstützt.

    Deswegen hatte ich mein Beispiel ja etwas "modifiziert". Mir ist bewusst, dass die drei Versionen unterstützt werden.

    Als Entwickler gibt man alle API-Versionen an, mit denen das Plugin uneingeschränkt lauffähig ist, der Core prüft dann, ob es eine Überschneidung mit den unterstützen Versionen gibt.

    Und genau das ist der Punkt.

    Du kannst dir auch 2016 als imaginäre API vorstellen (oder früher, ich weiß aus'm Kopf nicht, wann das neue Event-Listener-Interface entstanden ist).

    Bis inklusive 2019 (WSC 5.2) läuft das Paket, weshalb 2016-2019 hinterlegt sind.

    2021 kommt dann aber das WSC 6.0, das die Legacy-Klasse wcf\system\event\IEventListener entfernt. Neue Pakete verwenden spätestens seit WSC 3.0 (2017) wcf\system\event\listener\IParameterizedEventListener, die dann noch besteht, aber die "neue" Legacy-Klasse für wcf\system\event\listener\IEventListener wird.

    Versionen, die auf Basis von 2017/18/19 entworfen sind, sind dann nach wie vor funktionstüchtig. Aber Versionen, die mit der alten alten Klasse entwickelt wurden und in 2016-2019 theoretisch uneingeschränkt lauffähig sind, sperren sich dann. Hier nur 2016 zu entfernen bringt mit der aktuellen Umsetzung aber nichts, da sich das Paket durch z.B. 2019 nach wie vor installieren lässt. Sobald man dann aber die Stelle aufruft, wo der EventListener eingebunden wird, siehst du nur weiß-blau, weil die Version faktisch dann doch nicht kompatibel ist, auch wenn eine vollständige Kompatibilität zu 2019 vorhanden wäre.

    Oder habt ihr vor, in dem Fall nur die aktuelle Version 2021 zu unterstützen?

  • Fürs erste werden wir bei den nahezu (*) vollständig abwärtskompatiblen Version bleiben, daher ergibt sich das Problem bis dahin nicht. Es geht vor allem darum, dass System der API-Versionen produktiv zu nutzen und ggf. weiter zu verfeinern, wenn wir dies als notwendig erachten.

    Dazu kommt noch, dass wir aktuell an einer Änderung arbeiten, mit der die Nutzung von als "deprecated" markierter Code auch als solcher deutlich gemacht wird. Es gibt immer wieder Entwickler, die keine brauchbare IDE einsetzen und somit nur "händisch" diese Stellen identifizieren können. Generell gilt, dass bei der ältestesten angegebenen API-Kompatibilität kein Code verwendet werden sollte, der zu diesem Zeitpunkt schon deprecated war.

    Wir haben uns noch nicht endgültig dazu entschieden, wie wir zukünftig mit umfangreichen Änderungen mit dem Bruch der Abwärtskompatibilität umgehen. Wahrscheinlich läuft es auf ein Verwerfen der Kompatibilität mit allen älteren Versionen hinaus, letztlich ist das System auch für diesen Fall gerüstet - daher auch die Unterteilung in "legacy API versions" im Core.

    (*) Die Kompatibilität wird je nach Fall unterschiedlich gewährleistet, dabei kommen Lösungen in dieser Reihenfolge zum Tragen:

    1. Die neue Funktion ist vollständig über die alte API verfügbar, Calls werden transparent auf die neue API gemapped.
    2. Die alte Funktion kann nicht auf die neue API übertragen werden, das neue System wird parallel hochgezogen, wobei das alte System vollständig erhalten bleibt.
    3. Eine Kompatibilität kann nicht erreicht werden und die alte API stellt ein unüberwindbares Hindernis dar. In so einem Fall wird die API so verändert, dass Aufrufe auf die alte API ausdrücklich ohne Fehler bleiben, aber keine Auswirkung mehr haben. Ein Beispiel ist das Kommentar-System, das auf Grund des Wechsels auf HTML/WYSIWYG bei altem Code das Anlegen neuer Kommentare verweigerte.

    Der Fall (3.) ist das extremste Szenario und wird von uns so weit es geht vermieden, ggf. werden dadurch aber Änderungen auf eine zukünftige Version aufgeschoben. Als Vorlage dienen uns dabei alte Versionen unserer Apps, um so eine grundsätzliche API-Kompatibilität zu gewährleisten. Dabei gilt, dass der Wegfall von nicht-essentiellen Funktionen im Zweifel hingenommen wird, wenn dies der einzige Weg ist, um Fehler zu vermeiden. Es ist und bleibt eine stetige Gradwanderung zwischen der Unterstützung von Apps und Plugins für ältere Versionen auf der einen Seite, und der kontinuierlichen Weiterentwicklung und Verbesserung des Gesamtpaketes auf der anderen Seite.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!