DiscourseプラグインにEmberアドオン(Ember Power Selectなど)を追加できますか?

プラグインにいくつかの Ember アドオンを追加したいと考えています。

例を挙げると、Ember の Power Select があります。

(これはドロップダウンの処理に役立ちます。Discourse は select-kit を使用していますが、これも強力な機能を持っています。ただ、コードベースで過度に抽象化されているためカスタマイズが難しく感じます。そのため、Power Select を試してみたいと思います。)

通常の Rails/Ember アプリであれば、以下のようにアドオンを追加すると思います。

$ ember install ember-power-select

その後、以下のような記述を追加します。

hbs テンプレート:

<PowerSelect @options={{this.names}} @onChange={{this.foo}} as |name|>
  {{name}}
</PowerSelect>

それに対応する JavaScript ファイル:

import Controller from '@ember/controller';
export default class extends Controller {
  names = ['Stefan', 'Miguel', 'Tomster', 'Pluto']
  foo() { }
}

しかし、Discourse プラグインは標準的な Rails アプリではありません。動作させるために何か特別な手順が必要でしょうか?

「いいね!」 3

まあ、ヒントが得られるかどうかわかりながらこれを見ていたのですが、4 日後にこうなりました。

Ember は初心者ですが、「高度に抽象化された」部分に対処し、そのルールに従って動作させた方が、はるかに良い結果が得られると確信しています。他のアドオンを取り込むことが理解しにくいだけでなく、メンテナンスも難しくなるでしょう。

「いいね!」 1

Discourse を EmberCLI へ移行する作業を進めており、現在ほぼ完了間近です:

ありがとうございます、皆さん。

以前もその話を見ていましたが、アップグレードが完了するまで Ember アドオンを追加できないという確認ができて嬉しいです。つまり、アップグレードが完了すれば間もなく Ember アドオンの追加が可能になるということですね。それは素晴らしいことです。


これは興味深い問いかけだと思います。私の見解を少し述べさせていただきます。

Discourse の「抽象化された部分」を使うか、Ember アドオンを使うかという点について:もしかしたら間違っているかもしれませんが、プラグイン内で特定のタスクを行う際に Ember アドオンを使用する方が、Discourse が既に実装していることとは異なることを目指す場合、保守が容易になると思います。その考え方は以下の通りです。


例として、プラグイン内で全く新しいドロップダウンを追加したい場合を考えます。この区別が重要かもしれません。ここでは、Discourse のコードベースには存在しない新しいことをプラグインで実装しようとする場合について話しており、Discourse のメソッドから始めるか、それとも別のアドオンから始めるべきかという問いです。

多くの場合、選択の余地はありません。例えば、トピックにカスタムフィールドを追加したい場合、常に Discourse の既存のメソッドやコードをベースにカスタマイズすることになります。

しかし、ドロップダウンのように特定の機能に特化した場合、Discourse のメソッドを使用すると、それらが本来意図されていない用途に合わせて調整することになります。

オプション 1:カテゴリ選択器(category-chooser)などで見られる select-kit コードを取得し、新しい場所(カテゴリとは無関係な場所)に挿入し、それをカテゴリ選択ではなく自分の目的に合わせてカスタマイズしようとします。これは以前述べたように、少しトリッキーな作業です。

また、保守が困難になる可能性があります。もし Discourse チームがカテゴリ選択器の select-kit コードの動作を変更した場合、それが私のカスタマイズした新しいドロップダウンにも影響を与え、予期せぬ形で動作が変わってしまうかもしれません(なぜなら、実際のカテゴリ選択器とは少し異なる動作になるようにカスタマイズしていたためです)。

オプション 2:Ember 製の堅牢でありながらカスタマイズも容易なものを挿入する方法です。コードの仕組みを比較的明確に把握できます。この場合、Discourse がドロップダウンに追加するかもしれない新しい便利な機能を見逃す可能性はありますが、自分のドロップダウンの動作をより簡単に追跡・管理できるようになります。可能であれば、これが最も良い選択肢だと思います。

オプション 3:最初から完全に自作する。これが私がこれまで辿り着いてきた方向性です。コーディングが完了すれば、自分が完全に理解し、カスタマイズできるコードを持っているのは気持ちの良いものです。しかし、もちろん時間がかかり、(少なくとも初期バージョンは)Discourse チームや Ember チームが構築したものほど強力で堅牢ではないでしょう。

「いいね!」 3

スレッドを再度浮き上がらせます。また、Theme Components に Ember アドオンのサポートを追加できれば素晴らしいと思います。

「いいね!」 6

Bump.
Discourseに以下のようなアドオンを追加する場合
cd app/assets/javascripts/ && yarn add LIB_NAME
このアドオンはプラグイン内でどのように利用可能になりますか?

これは最近可能なのでしょうか?(可能であれば、どのように?)

「いいね!」 2

残念ながら、できません。EmberアドオンはDiscourseコアに追加できますが、プラグイン経由では追加できません。将来的には、プラグイン/テーマがnpm依存関係を指定する方法を追加するかもしれませんが、それは当面のロードマップにはありません。

「いいね!」 2

まさにこのことをGoogleで検索していました。

@davidへのサイド質問ですが、プラグイン経由では利用できませんが、理論的にはコアにプラグインを追加してから、セルフホスティングしている場合にプラグイン内で使用することは可能でしょうか?もし可能なら、どのようにすればよいですか?(app/assets/javascripts/discoursepackage.json に追加しようとしましたが、単純な何かを見落としているためか、ロードできませんでした。)

「いいね!」 1

はい、できます。しかし、Discourseをフォークして、すべてのコミットを取り込もうとするのは実際にはお勧めできません。そうした人は皆、やったことを非常に後悔しています。

うーん。しかし、それが1つのファイルだけであれば、app.ymlがDiscourseをクローンした直後に、そのファイルをどこかから/var/www/discourseにコピーするように設定できるはずです。サイト設定の制限を変更するために、以前にそのようなことをしたことがあると思います。

「いいね!」 2

@pfaffman が言及したように、app.yml の変更によって動作するようにハッキングできる 可能性 があります。yarn install および assets:precompile ステップの前に変更が行われたことを確認する必要があります。

しかし、これは完全にサポートされておらず、予期しない問題を引き起こす可能性があります。お勧めしません。

興味本位で、どの Дополнение (addon) を使用したいと思っていましたか?

「いいね!」 2

そこまで深くは調べていませんが、多くの人気アドオンには、Discourse 自体に既に存在する機能があることがわかりました。アドオンの魅力は、一般的にドキュメントが少し優れており、行き詰まった場合の利用可能なリソースがかなり充実していることです。例えば、ember-concurrency には豊富なドキュメントと「解決済み」の問題があり、新規開発者であれば、そのアドオンを利用することで、より簡単に作業を開始できるでしょう。

しかし、言ったように、それは欲求というよりも疑問でした。

「いいね!」 1

つまり、あなたは文字通り面倒を探しているのです。既存のリソースでニーズが満たされないことが判明するまで、アドオンを検討しないことをお勧めします。

しかし、それが Discourse が今日または将来その問題を解決する方法と互換性があるかどうかはわかりません。Discourse のために開発したいのであれば、Discourse で物事がどのように機能するかを示す例を見るのが良いでしょう。

鍵を落とした車の下ではなく、ランプの下で探している人にならないでください。ランプの下の方がよく見えるからです。