Kern-Plugins, bei denen eine Abspaltung eines zusammengeführten Plugins verwendet wurde

Ich bin zwar etwas spät dran, aber was macht man in Bezug auf die Migration beliebter Plugins in den Discourse-Kern, wenn man eine modifizierte Fork eines Plugins verwendet hat, das zusammengeführt wurde?

Als Referenz Set up Discord notifications with the discourse-chat-integration plugin - #71 by skatefriday hatte ich die Möglichkeit hinzugefügt, markierte Beiträge an Discord weiterzuleiten, da es für Moderatoren wichtig ist, sofort eine Benachrichtigung zu erhalten, dass ein Benutzer einen Beitrag markiert hat, und Discord das Kommunikationsmedium mit der geringsten Latenz dafür ist.

Das bestehende Discourse-Chat-Integrations-Plugin hatte diese Funktion nicht und hat sie immer noch nicht.

Vor einiger Zeit hat ein anderes Mitglied meines Teams unseren Discourse-Server aktualisiert, und als er bemerkte, dass das Plugin jetzt nativ in Discourse enthalten war, weil der Build beim Update fehlgeschlagen war, entfernte er einfach den Klon meiner Fork.

Und jetzt habe ich bemerkt, dass meine Funktion verschwunden ist.

Was ist also die beste Vorgehensweise, wenn eine selbst gehostete Einrichtung ein modifiziertes Plugin verwendet hat, um die Funktionen des modifizierten Plugins wiederherzustellen?

4 „Gefällt mir“

Am besten schreiben Sie ein Plugin, das das ursprüngliche Plugin überschreibt.

Eine andere Möglichkeit besteht darin, in der Zeile, bevor Sie Ihren Fork klonen, das zusammengeführte Plugin mit „rm -rf“ zu löschen.

Tun Sie dies also einfach in Ihrem neuen Plugin, anstatt das Hauptplugin zu forken. Es wird einen Hook dafür geben.

3 „Gefällt mir“

Ein komplett neues Plugin schreiben? Das erscheint übertrieben.

Das ist wahrscheinlich die Antwort.

Das verstehe ich überhaupt nicht. Ich wollte die Funktionalität des bestehenden Plugins mit der zusätzlichen Möglichkeit, ihm mitzuteilen, dass es markierte Beiträge an den Chat-Client, in meinem Fall Discord, weiterleiten soll. Schlagen Sie mir wieder vor, ein komplett neues Plugin von Grund auf neu zu schreiben, das einen Großteil der Funktionalität des bestehenden Plugins dupliziert und die neue Funktion hinzufügt, die ich wollte? Wieder scheint das übertrieben.

In gewissem Maße können Sie die Logik in bestehenden Klassen ersetzen/erweitern. Dies könnte eine Option sein, um das gebündelte Plugin zu erweitern. Sie würden ein neues Plugin schreiben, das einfach die geänderte Logik hinzufügt. Verwenden Sie Modul-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"
				# etwas Eigenes tun
			else
				# dies ruft die ursprüngliche Logik auf
				super(f00, bar)
			end
		end
	end
end

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

Ich habe diesen Konstruktor verwendet, um bestimmte Controller unter bestimmten Bedingungen einzuschränken.

1 „Gefällt mir“

Ich kann das nachvollziehen und habe dies auch als eine der wirkungsvollsten technischen Komplikationen des „Bündelns von Plugins mit dem Kern“ empfunden. Wir hatten einige geforkte Plugins, und es war sehr kompliziert, sie zum Laufen zu bringen, ohne das gebündelte Plugin zu entfernen.

Ich glaube nicht, dass Jay das vorschlägt. Ein Plugin kann auch sehr spezifische Teile eines anderen Plugins überschreiben.

Der beste Ansatz wäre, das Team davon zu überzeugen, dass Ihr Code es wert ist, in das offizielle Plugin integriert zu werden. Das funktioniert, wenn Ihre Änderung generisch oder flexibel genug ist. Ich sehe, Sie haben bereits einen Fork erstellt, und Ihre Änderungen/Ergänzungen sind ziemlich sauber. Vielleicht könnte der fest codierte String „Flagged“ in einer Übersetzungsdatei stehen, und wenn Sie :flagged standardmäßig auf false setzen, müssen Sie den ursprünglichen Event-Handler nicht mit einem zusätzlichen Parameter ändern, aber abgesehen davon sieht es lohnenswert aus. Wenn ich Sie wäre, würde ich es auf den neuesten Stand bringen, einen PR öffnen und dies im Plugin-Thema besprechen.

Wenn dieser Weg fehlschlägt, könnten Sie einfach ein Plugin erstellen, das diese drei Funktionen, die Sie geändert haben, überschreibt und den on(:reviewable_created)-Handler hinzufügt.

1 „Gefällt mir“

Der Sinn von Plugins ist, dass man Discourse nicht forken muss. Es ist nicht übertrieben, es ist der Grund, warum Plugins existieren.

Nein. Dein Plugin wird einfach die neue Funktion hinzufügen, um markierte Beiträge an Discord zu senden, und den bestehenden Code dafür aufrufen. Es sind wahrscheinlich zehn Zeilen Code und es wird nicht erfordern, dass du Upstream-Änderungen in dein Plugin mergen musst.