Discourseプラグインをgemとしてパッケージ化する

Pavilion は、サブスクリプション クライアントから始めて、一部の Discourse プラグインを Ruby gem としてパッケージ化し始めました。

当社のサブスクリプション クライアントは、依然として この gem を読み込む別のプラグイン ですが、そのバックエンドは完全に gem としてパッケージ化され、別のプラグインはまもなく完全に非推奨になります。これは、gem として適したプラグインで同様のことを行うための簡単な入門ガイドです。

Gem の操作方法

まず、Ruby gem の操作方法を理解する必要があります。これまでに gem を作成したことがない場合は、Discourse プラグインを gem として扱う前に、まず独自の標準 gem を単独で作成することをお勧めします。このガイドをお勧めします。

プラグインが Discourse にコードを挿入する方法

Discourse プラグイン gem が Discourse にコードを挿入する方法は、標準プラグインがコードを挿入する方法とまったく同じです。唯一の違いはパッケージングです。したがって、プラグインを gem として操作するには、標準プラグインが Discourse にコードを挿入する方法も理解する必要があります。ここでは、基本的に 2 つのことを理解する必要があります。

  1. Discourse プラグインは Rails エンジンです。おそらくすでにこれに気づいているでしょうが、これが何を意味するのかを真に理解する必要があります。Rails エンジンに関する このガイド を参照することをお勧めします。たとえば、Discourse プラグインの plugin.rb ファイルのコードの多くが after_initialize コールバックでラップされている理由を理解する必要があります。

  2. Discourse の初期化プロセスがどのように機能するか。ここでは、理解すべきファイルは 1 つだけです。つまり、discourse/discourse/config/application.rb ファイルです。ここでほとんどの Rails コードが読み込まれ、すべてのプラグイン コードが読み込まれ、プラグインが初期化されます。そのファイルをある程度詳しく調べ、プラグイン ファイルがどこでどのように要求され、次に初期化されるかを理解してください。

Gem としての Discourse プラグインの仕組み

これらすべてをまとめるには、上記の 2 つのトピックが Discourse プラグイン gem でどのように統合されるかを理解する必要があります。特に次の点に注意してください。

  1. Discourse プラグイン gem では、engine.rb ファイルは plugin.rb ファイルと同様の役割を果たしますが、いくつかの構成の違いがあります。subscription client gem engine.rb ファイルを確認し、標準の plugin.rb ファイルと比較してください。

  2. 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 上のバージョンではなく、ローカルバージョンが読み込まれます。

質問がある場合や行き詰まった場合は、ここに投稿してください。お手伝いします。

「いいね!」 14

このアプローチでは、プラグインでDiscourseのテーマ要素をカバーすることはできないようです。より良いタイトルは「Discourse固有のRailsエンジンをgemとしてパッケージ化する」かもしれません。

「いいね!」 1

その通りです。フロントエンドのJSフレームワーク関連は別途処理する必要があります。

技術的には正確ですが、そのタイトルが良いとは思いません。なぜなら、そのタイトルは適切な人々をトピックから遠ざけてしまう可能性があるからです。多くのプラグイン開発者は、自分たちが「Discourse固有のRails Engine」を開発しているとは認識していないでしょう。

実際、私は現在、コードをバックエンドプラグインとフロントエンドテーマコンポーネントに分けて管理することが多くなっています。これにより、ステージング環境や本番環境へのデプロイ時にフロントエンド関連の作業を非常に迅速に反復処理できます。

「いいね!」 3

私もそれに同意します。このドキュメントは一部の上級開発者のみに役立つかもしれませんが、すべての人を対象とするべきです。

共有していただきありがとうございます。

「いいね!」 1

高度なトピックであることに同意します。