Основные плагины, где использовался форк объединённого плагина

Чуть запоздал с вопросом, но касательно миграции популярных плагинов в ядро Discourse: что делать, если использовалась модифицированная версия плагина, который был включён в ядро?

Для справки: Set up Discord notifications with the discourse-chat-integration plugin - #71 by skatefriday Я добавил возможность пересылать помеченные сообщения в Discord, так как для модераторов критически важно мгновенно получать уведомления о том, что пользователь пометил сообщение, а Discord — это среда с наименьшей задержкой для таких уведомлений.

В существующем плагине интеграции с Discourse Chat этой функции не было, и до сих пор нет.

Некоторое время назад другой член моей команды обновил наш сервер Discourse и, заметив, что плагин теперь входит в стандартную поставку Discourse, из-за сбоя сборки при обновлении просто удалил клон моей модифицированной версии.

Теперь я обнаружил, что моя функция исчезла.

Так какова лучшая практика для самохостинговых установок, использовавших модифицированный плагин, чтобы восстановить функции из этой модификации?

Лучшее решение — написать плагин, который переопределяет существующий.

Другой вариант: перед клонированием вашей ветки удалите слитый плагин командой “rm -rf”.

Поэтому сделайте это прямо в своём новом плагине, вместо того чтобы форкать основной. Должен быть хук для реализации такой функции.

Написать совершенно новый плагин? Это кажется излишним.

Вероятно, это и есть ответ.

Я совсем этого не понимаю. Мне нужна функциональность существующего плагина с добавлением возможности перенаправлять помеченные сообщения в чат-клиент, в моём случае — в 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(foo, bar)
			end
		end
	end
end

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

Я использовал этот подход, чтобы ограничить некоторые контроллеры при определенных условиях.

Я вас понимаю, и я тоже считаю, что это одна из самых серьезных технических проблем, связанных с «упаковкой плагинов в ядро». У нас было несколько форков плагинов, и их было очень сложно заставить работать без удаления встроенного плагина.

Я не думаю, что Джей это предлагает. Плагин также может переопределять очень конкретные части другого плагина.

Лучший подход — убедить команду, что ваш код стоит включить в официальный плагин. Это сработает, если ваше изменение достаточно универсально или гибко. Я вижу, что вы уже сделали форк, и ваши изменения/добавления выглядят довольно чисто. Возможно, закодированную строку “Flagged” можно вынести в файл переводов, и если вы установите :flagged по умолчанию в false, то вам не придется модифицировать оригинальный обработчик событий с дополнительным параметром, но помимо этого, всё выглядит достойно. Если бы я был на вашем месте, я бы привёл код в актуальное состояние, открыл PR и обсудил это в теме плагина.

Если этот путь не сработает, вы можете просто создать плагин, который переопределяет эти три изменённые вами функции и добавляет обработчик on(:reviewable_created).

Суть плагинов в том, чтобы вам не приходилось делать форк Discourse. Это не избыточно, именно для этого плагины и существуют.

Нет. Ваш плагин просто добавит новую функцию для отправки помеченных постов в Discord и вызовет существующий код для этого. Это, вероятно, десять строк кода, и вам не потребуется сливать изменения из upstream в свой плагин. РЕДАКТИРОВАНО: Как предлагали последние два поста, которые я не прочитал перед ответом. :person_shrugging: