Ein Discourse-Plugin als Gem verpacken

Pavilion hat begonnen, einige Discourse-Plugins als Ruby-Gems zu verpacken, beginnend mit unserem Abonnement-Client.

Unser Abonnement-Client ist immer noch ein separates Plugin, das jetzt diesen Gem lädt, aber sein Backend ist jetzt vollständig als Gem verpackt und das separate Plugin wird bald vollständig veraltet sein. Dies ist eine kleine Einführung, wie Sie dasselbe mit Ihren Plugins tun können, die besser als Gems geeignet sind.

Arbeiten mit Gems

Zuerst müssen Sie verstehen, wie man mit Ruby-Gems arbeitet. Wenn Sie noch nie einen Gem erstellt haben, empfehle ich Ihnen, Ihren eigenen Standard-Gem isoliert zu erstellen, bevor Sie versuchen, ein Discourse-Plugin als Gem zu bearbeiten. Ich empfehle diesen Leitfaden

Wie Plugins Code in Discourse injizieren

Die Art und Weise, wie ein Discourse-Plugin-Gem Code in Discourse injiziert, ist genau dieselbe wie bei einem Standard-Plugin. Der einzige Unterschied ist die Verpackung. Um mit einem Plugin als Gem zu arbeiten, müssen Sie auch verstehen, wie ein Standard-Plugin Code in Discourse injiziert. Hier gibt es im Wesentlichen zwei Dinge zu verstehen:

  1. Ein Discourse-Plugin ist eine Rails-Engine. Das wissen Sie wahrscheinlich schon, aber Sie müssen wirklich verstehen, was das bedeutet. Ich empfehle, diesen Leitfaden zu Rails-Engines durchzugehen. Sie müssen zum Beispiel verstehen, warum viel Code in der Datei plugin.rb eines Discourse-Plugins in einem after_initialize-Callback gekapselt ist.

  2. Wie der Initialisierungsprozess von Discourse funktioniert. Hier gibt es wirklich nur eine Datei zu lesen und zu verstehen, nämlich die Datei discourse/discourse/config/application.rb. Dort wird der meiste Rails-Code geladen, dort wird der gesamte Plugin-Code geladen und dort werden die Plugins initialisiert. Gehen Sie diese Datei eingehend durch und verstehen Sie, wo und wie die Plugin-Dateien angefordert und dann initialisiert werden.

Wie ein Discourse-Plugin als Gem funktioniert

Um alles zusammenzufügen, müssen Sie dann verstehen, wie die obigen beiden Themen in einem Discourse-Plugin-Gem synthetisiert werden. Beachten Sie insbesondere Folgendes:

  1. In einem Discourse-Plugin-Gem spielt die Datei engine.rb eine ähnliche Rolle wie die Datei plugin.rb, mit einigen Konfigurationsunterschieden. Schauen Sie sich die Datei subscription client gem engine.rb an und vergleichen Sie sie mit einer Standard-Plugin.rb-Datei.

  2. In einem Discourse-Plugin-Gem müssen Sie discourse/discourse in Ihren rspec-Tests mocken, um den Gem richtig testen zu können. Sie müssen nicht die gesamte Discourse-App mocken, nur die Teile, gegen die Sie testen. Dies tun Sie, indem Sie eine Skelett-Rails-App mit den spezifischen Discourse-Klassen und Endpunkten erstellen, die Sie benötigen, und diese als rspec-Support laden. Sehen Sie sich die Mock-Discourse-App des Abonnement-Client-Gems an und wo sie in der spec rails_helper.rb geladen wird.

Laden eines lokalen Gems in einem Discourse-Plugin

Um Ihre lokale Version eines Gems in einem Discourse-Plugin zu laden, wenn Sie mit diesem Plugin und Gem in der Entwicklung arbeiten, müssen Sie Folgendes tun.

Verlinken Sie Ihren Gem-Ordner symbolisch mit dem Gem-Ordner des entsprechenden Plugins. Um zum Beispiel mit meiner lokalen Version des discourse_subscription_client-Gems im discourse-subscription-client-Plugin zu arbeiten, mache ich Folgendes:

ln -s /Users/angus/discourse/gems/discourse_subscription_client /Users/angus/discourse/discourse/plugins/discourse-subscription-client/gems/3.2.1/gems

Ändern Sie dann den Namen des symbolisch verknüpften Gem-Ordners im Plugin, sodass er dem Namensmuster eines Standard-Gem-Ordners entspricht, z. B.

discourse_subscription_client-0.1.0.pre11

Wenn Ihr Plugin nun Ihren Discourse-Plugin-Gem lädt, wird Ihre lokale Version anstelle der Version auf Rubygems geladen.

Wenn Sie Fragen haben oder nicht weiterkommen, posten Sie hier und ich helfe Ihnen weiter.

14 „Gefällt mir“

Es scheint, dass dieser Ansatz nicht möglich ist, um Discourse-Themen in einem Plugin abzudecken? Vielleicht wäre ein besserer Titel „Ein Discourse-spezifisches Rails-Engine als Gem verpacken“.

1 „Gefällt mir“

Das ist richtig, Sie müssen die Frontend-JS-Framework-Sachen separat behandeln.

Obwohl technisch korrekt, würde ich nicht zustimmen, dass dieser Titel besser wäre, da dies einige der richtigen Leute davon abhalten würde, das Thema zu lesen: Die meisten Leute, die Plugins schreiben, identifizieren sie möglicherweise nicht als „Discourse-spezifische Rails Engines“.

Ich trenne meinen Code jetzt häufiger in Backend-Plugins und Frontend-Theme-Komponenten, damit ich die Frontend-Sachen bei Bereitstellungen in Staging- und Produktionsumgebungen sehr schnell iterieren kann.

3 „Gefällt mir“

Dem stimme ich zu, obwohl dieses Dokument möglicherweise nur für einige fortgeschrittene Entwickler nützlich ist, sollte es alle Leute abdecken.

Und danke für das Teilen.

1 „Gefällt mir“

Ich stimme zu, dass es ein fortgeschrittenes Thema ist.