Pavilion は、サブスクリプション クライアントから始めて、一部の Discourse プラグインを Ruby gem としてパッケージ化し始めました。
当社のサブスクリプション クライアントは、依然として この gem を読み込む別のプラグイン ですが、そのバックエンドは完全に gem としてパッケージ化され、別のプラグインはまもなく完全に非推奨になります。これは、gem として適したプラグインで同様のことを行うための簡単な入門ガイドです。
Gem の操作方法
まず、Ruby gem の操作方法を理解する必要があります。これまでに gem を作成したことがない場合は、Discourse プラグインを gem として扱う前に、まず独自の標準 gem を単独で作成することをお勧めします。このガイドをお勧めします。
プラグインが Discourse にコードを挿入する方法
Discourse プラグイン gem が Discourse にコードを挿入する方法は、標準プラグインがコードを挿入する方法とまったく同じです。唯一の違いはパッケージングです。したがって、プラグインを gem として操作するには、標準プラグインが Discourse にコードを挿入する方法も理解する必要があります。ここでは、基本的に 2 つのことを理解する必要があります。
-
Discourse プラグインは Rails エンジンです。おそらくすでにこれに気づいているでしょうが、これが何を意味するのかを真に理解する必要があります。Rails エンジンに関する このガイド を参照することをお勧めします。たとえば、Discourse プラグインの
plugin.rbファイルのコードの多くがafter_initializeコールバックでラップされている理由を理解する必要があります。 -
Discourse の初期化プロセスがどのように機能するか。ここでは、理解すべきファイルは 1 つだけです。つまり、discourse/discourse/config/application.rb ファイルです。ここでほとんどの Rails コードが読み込まれ、すべてのプラグイン コードが読み込まれ、プラグインが初期化されます。そのファイルをある程度詳しく調べ、プラグイン ファイルがどこでどのように要求され、次に初期化されるかを理解してください。
Gem としての Discourse プラグインの仕組み
これらすべてをまとめるには、上記の 2 つのトピックが Discourse プラグイン gem でどのように統合されるかを理解する必要があります。特に次の点に注意してください。
-
Discourse プラグイン gem では、
engine.rbファイルはplugin.rbファイルと同様の役割を果たしますが、いくつかの構成の違いがあります。subscription client gem engine.rb ファイルを確認し、標準の plugin.rb ファイルと比較してください。 -
Discourse プラグイン gem では、gem を適切にテストするために、rspec テストで
discourse/discourseをモックする必要があります。Discourse アプリ全体をモックする必要はありません。テスト対象のディスコースのクラスとエンドポイントの部分だけをモックすれば十分です。これは、特定の Discourse クラスとエンドポイントを持つスケルトンの Rails アプリを作成し、それを rspec サポートとして読み込むことで行います。サブスクリプション クライアント gem の mock Discourse app と、それが spec rails_helper.rb で読み込まれる場所 を参照してください。
Discourse プラグインでローカル Gem を読み込む方法
開発でそのプラグインと gem を操作しているときに、Discourse プラグインでローカルバージョンの gem を読み込むには、次の手順を実行する必要があります。
gem フォルダーを関連プラグインの gem フォルダーにシンボリックリンクします。たとえば、discourse-subscription-client プラグインで discourse_subscription_client gem のローカルバージョンを操作するには、次の手順を実行します。
ln -s /Users/angus/discourse/gems/discourse_subscription_client /Users/angus/discourse/discourse/plugins/discourse-subscription-client/gems/3.2.1/gems
次に、プラグイン内のシンボリックリンクされた gem フォルダーを、標準の gem フォルダーと同じ名前パターンを使用するように変更します。例:
discourse_subscription_client-0.1.0.pre11
これで、プラグインが Discourse プラグイン gem を読み込むときに、rubygems 上のバージョンではなく、ローカルバージョンが読み込まれます。
質問がある場合や行き詰まった場合は、ここに投稿してください。お手伝いします。