Чуть запоздал с вопросом, но касательно миграции популярных плагинов в ядро Discourse: что делать, если использовалась модифицированная версия плагина, который был включён в ядро?
В существующем плагине интеграции с Discourse Chat этой функции не было, и до сих пор нет.
Некоторое время назад другой член моей команды обновил наш сервер Discourse и, заметив, что плагин теперь входит в стандартную поставку Discourse, из-за сбоя сборки при обновлении просто удалил клон моей модифицированной версии.
Теперь я обнаружил, что моя функция исчезла.
Так какова лучшая практика для самохостинговых установок, использовавших модифицированный плагин, чтобы восстановить функции из этой модификации?
Написать совершенно новый плагин? Это кажется излишним.
Вероятно, это и есть ответ.
Я совсем этого не понимаю. Мне нужна функциональность существующего плагина с добавлением возможности перенаправлять помеченные сообщения в чат-клиент, в моём случае — в 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 в свой плагин. РЕДАКТИРОВАНО: Как предлагали последние два поста, которые я не прочитал перед ответом.