我来得有点晚了,但关于将流行插件迁移到核心 Discourse 的问题,如果有人使用了已合并插件的修改后的分支,该怎么办?
供参考:Set up Discord notifications with the discourse-chat-integration plugin - #71 by skatefriday 我添加了将标记的帖子通过管道传输到 Discord 的功能,因为版主立即收到用户标记帖子的通知非常重要,而 Discord 是最低延迟的通信媒介。
现有的 Discourse 聊天集成插件中没有,现在仍然没有此功能。
前段时间,我们团队的另一名成员更新了我们的 Discourse 服务器,在注意到该插件现在已与 Discourse 捆绑在一起(因为更新时构建失败),他只是删除了我分支的克隆。
现在我注意到我的功能不见了。
那么,对于自托管设置曾使用修改后的插件来恢复修改后插件功能的最佳实践是什么?
4 个赞
pfaffman
(Jay Pfaffman)
2026 年1 月 30 日 01:41
2
最好的办法是编写一个覆盖该插件的插件。
另一个办法是在克隆你的 fork 之前的那一行,对已合并的插件执行 “rm -rf”。
所以在你的新插件中就做这件事,而不是 fork 主插件。应该有一个钩子(hook)来实现这一点。
3 个赞
pfaffman:
最好的办法是编写一个覆盖现有插件的插件。
编写一个全新的插件?这似乎有点过了。
这可能是答案。
我完全不明白这一点。我想要现有插件的功能,再加上能够告诉它将标记的帖子通过管道传输到聊天客户端,在我的情况下是 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 个赞
RGJ
(Richard - Communiteq)
2026 年1 月 30 日 07:19
5
我理解你的感受,而且我发现这是“将插件与核心捆绑”带来的最具影响力的技术难题之一。我们有一些分叉的插件,在不移除捆绑插件的情况下,让它们正常工作非常复杂。
我不认为 Jay 是那个意思。一个插件也可以覆盖另一个插件非常特定的部分。
最好的方法是说服团队你的代码值得合并到官方插件中。如果你的修改是通用的或足够灵活,这将是可行的。我看到你已经创建了一个分叉,而且你的修改/添加非常干净。也许硬编码的“Flagged”字符串 可以放在翻译文件中,如果你让 :flagged 默认为 false,那么你就无需用额外的参数修改原始事件处理程序 ,但除此之外,它看起来是值得的。如果我是你,我会让它保持最新,打开一个 PR 并在插件主题中讨论此事。
如果这条路走不通,你可以简单地构建一个覆盖你更改的这三个函数,并添加 on(:reviewable_created) 处理程序的插件。
2 个赞
pfaffman
(Jay Pfaffman)
2026 年1 月 30 日 10:47
6
skatefriday:
编写一个全新的插件?
插件的意义在于您不必分叉 (fork) Discourse。这并不算多余,这就是插件存在的原因。
不会。您的插件将仅添加将标记的帖子发送到 Discord 的新功能,并调用现有代码来完成此操作。这可能只有十行代码,并且不需要您将上游更改合并到您的插件中。编辑:就像我回复前没有阅读的最后两个帖子所建议的那样。