Discourse プラグインの構築は、いくつかの癖を覚えれば非常に簡単になります。この投稿の目的は、スケルトン(骨格)プラグインを作成し、基本を解説することです。
開発環境
お使いのコンピュータで Discourse の開発環境が実行されていることを確認してください。適切なセットアップガイド を使用し、完了してから戻ってくることをお勧めします。
plugin.rb
GitHub - discourse/discourse-plugin-skeleton: Template for Discourse plugins · GitHub を使用して、plugins ディレクトリ内に完全な Discourse プラグインのスケルトンを作成してください
スケルトンは現在 Discourse コアにバンドルされており、
rake plugin:create[plugin-name]を実行するとスケルトンを使用してプラグインが作成されます
Discourse が起動すると、plugins ディレクトリ内の plugin.rb ファイルを含むサブディレクトリを探します。plugin.rb ファイルには2つの目的があります。1つ目は、プラグインに関する必須情報(名前、連絡先、説明など)を含むプラグインのマニフェストとして機能することです。2つ目は、プラグインの実行に必要な Ruby コードを初期化することです。
今回の場合、Ruby コードは追加しませんが、plugin.rb は依然として必要です。basic-plugin というディレクトリを作成し、その中に plugin.rb ファイルを作成して、以下の内容を入力しましょう。
basic-plugin/plugin.rb
# name: basic-plugin
# about: プラグインの動作を示すための非常にシンプルなプラグイン
# version: 0.0.1
# authors: Awesome Plugin Developer
# url: https://github.com/yourusername/basic-plugin
このファイルを作成したら、ローカルサーバーを再起動し、プラグインが読み込まれていることを確認してください。
重要な注意点!
通常の Rails 開発に慣れている場合、プラグインのリロード処理がそれほどスムーズではないことに気づくかもしれません。一般的に、プラグインに変更を加えた場合は、<kbd>Ctrl</kbd>+<kbd>c</kbd> を押してサーバーの実行を停止し、その後 bin/dev を使用して再度実行する必要があります。
変更が反映されませんでした! 
キャッシュが完全にクリアされない場合、特に新しいファイルを作成したり古いファイルを削除したりした際に発生します。この問題を回避するには、tmp フォルダを削除し、Rails を再起動してください。Mac では以下のコマンドで1行で実行できます:rm -rf tmp; bin/dev。
プラグインが読み込まれたことを確認する
ローカルサーバーを再起動した後、/admin/plugins の URL にアクセスしてください(まず 管理者アカウントとしてログイン していることを確認してください。プラグインレジストリは管理者のみが閲覧できます)。
すべてが正しく動作していれば、リストにプラグインが表示されるはずです:
おめでとうございます。これで最初のプラグインを作成しました!
JavaScript を追加しよう
現在、プラグインは何も実行していません。Discourse が読み込まれた際にアラートボックスを表示する JavaScript ファイルを追加しましょう。これは実際のプラグインとしては推奨されませんが、実行中のアプリケーションに JavaScript を挿入する方法を示すために使用します。
以下のファイルを作成してください:
plugins/basic-plugin/assets/javascripts/discourse/initializers/alert.js
export default {
name: "alert",
initialize() {
alert("アラートボックスは煩わしい!");
},
};
これでローカルサーバーを再起動すると、画面に「アラートボックスは煩わしい!」と表示されるはずです。(表示されない場合は、上記の「変更が反映されませんでした!」セクションを参照してください)。
この仕組みを順を追って説明します:
-
assets/javascripts/discourse/initializersに配置された JavaScript ファイルは、Discourse アプリケーションが読み込まれる際に自動的に実行されます。 -
このファイルは
nameとinitialize関数を持つ1つのオブジェクトをexportしています。 -
nameは一意である必要があるので、ここではalertとしました。 -
initialize()関数はアプリケーションが読み込まれた際に呼び出されます。今回の場合、alert()コードを実行するだけです。
これで公式の Discourse プラグイン開発者になりました!
シリーズの続き
パート1: このトピック
パート2: Plugin Outlets
パート3: Site Settings
パート4: git setup
パート5: Admin interfaces
パート6: Acceptance tests
パート7: Publish your plugin
このドキュメントはバージョン管理されています。変更提案は GitHub で行ってください。

