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:
-
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.rbeines Discourse-Plugins in einemafter_initialize-Callback gekapselt ist. -
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:
-
In einem Discourse-Plugin-Gem spielt die Datei
engine.rbeine ähnliche Rolle wie die Dateiplugin.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. -
In einem Discourse-Plugin-Gem müssen Sie
discourse/discoursein 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.