マージされたプラグインのフォークが使用されていたコアプラグイン

少し乗り遅れましたが、人気のプラグインのDiscourseコアへの移行に関して、マージされたプラグインの変更されたフォークを使用していた場合、どうすればよいでしょうか?

参考として、Set up Discord notifications with the discourse-chat-integration plugin - #71 by skatefriday で、モデレーターがユーザーが投稿をフラグ付けしたことを即座に通知を受けることが重要であるため(Discordはこのための最も低遅延の通信媒体です)、フラグ付けされた投稿をDiscordにパイプする機能を追加しました。

既存のDiscourseチャット統合プラグインには、この機能は含まれておらず、現在も含まれていません。

しばらく前に、チームの別のメンバーがDiscourseサーバーを更新した際、プラグインがDiscourseにネイティブでバンドルされていることに気づき、更新時にビルドが失敗したため、私のフォークのクローンを単純に削除しました。

そして今、私の機能がなくなったことに気づきました。

では、セルフホストされたセットアップで変更されたプラグインを使用して、変更されたプラグインの機能を復元するためのベストプラクティスは何でしょうか?

「いいね!」 4

最善の方法は、プラグインをオーバーライドするプラグインを作成することです。

もう一つの方法は、フォークをクローンする直前の行で、マージされたプラグインを「rm -rf」することです。

ですから、メインのものをフォークするのではなく、新しいプラグインでまさにそれを行ってください。それを行うためのフックがあるはずです。

「いいね!」 3

完全に新しいプラグインを作成するのですか?それはやりすぎのように思えます。

これが答えでしょう。

これは全く理解できません。既存のプラグインの機能が欲しかったのですが、フラグが付けられた投稿をチャットクライアント(この場合はDiscord)にパイプする機能を追加したいだけでした。既存のプラグインの機能を大部分複製し、追加したい新機能を追加する、完全に新しいプラグインをゼロから書くことをもう一度提案しているのですか?やはり、やりすぎのように思えます。

ある程度、既存のクラスのロジックを置き換えたり拡張したりできます。これはバンドルされたプラグインを拡張するオプションになるかもしれません。変更されたロジックを追加するだけの新しいプラグインを作成します。 module prepend を使用します。

enabled_site_setting :myoverridingplugin_enabled

module ::MyOverridingPlugin
	PLUGIN_NAME = "my-overriding-plugin"

	class Engine < ::Rails::Engine
		engine_name MyOverridingPlugin::PLUGIN_NAME
		isolate_namespace MyOverridingPlugin
	end

	module SomeClassOverrides
		def overriding_method(foo, bar)
			if foo == "something"
				# カスタムの処理を行う
			else
				# オリジナルのロジックを呼び出す
				super(f00, bar)
			end
		end
	end
end

after_initialize do
	SomeClass.prepend(MyOverridingPlugin::SomeClassOverrides)
end

私はこのコンストラクタを使用して、特定の条件下で一部のコントローラを制限しました。

「いいね!」 1

私も同じように感じており、これを「コアにプラグインをバンドルする」ことの最も影響力のある技術的な複雑さの1つだと考えています。私たちはいくつかのフォークされたプラグインを持っており、バンドルされたプラグインを削除せずにそれらを機能させるのは非常に困難でした。

Jayがそれを提案しているとは思えません。プラグインは、他のプラグインの非常に具体的な部分をオーバーライドすることもできます。

最善の方法は、あなたのコードが公式プラグインにマージされる価値があるとチームを説得することです。あなたの修正が汎用的または柔軟性があれば、それはうまくいくでしょう。あなたはすでにフォークを作成しており、あなたの変更/追加はかなりきれいに見えます。たぶん、ハードコードされた「Flagged」文字列は翻訳ファイルに入れることができ、:flaggedがデフォルトでfalseになるようにすれば、元のイベントハンドラを余分なパラメータで変更する必要はありませんが、それ以外は、価値があるように見えます。私があなたの立場なら、最新の状態に保ち、PRを開き、プラグイントピックでこれについて議論します。

その方法がうまくいかない場合は、変更した3つの関数をオーバーライドし、:reviewable_createdハンドラを追加するプラグインを単純にビルドすることもできます。

「いいね!」 2

プラグインの目的は、Discourseをフォークする必要がないようにすることです。それは過剰ではなく、プラグインが存在する理由です。

いいえ。あなたのプラグインは、フラグが立てられた投稿をDiscordに送信する新しい機能を追加するだけで、既存のコードを呼び出してそれを実行します。おそらく10行程度のコードで、アップストリームの変更をあなたのプラグインにマージする必要はありません。編集:前の2つの投稿が、私が返信する前に読まなかったために示唆したように。:person_shrugging: