如何重新编译插件而不重新编译 Discourse?

如何在不重新编译 Discourse(即不升级到最新版本)的情况下重新编译插件?我遇到了一个问题:Discourse 的更新非常频繁,而且这些更新经常导致插件无法正常工作。我希望能够在不更新 Discourse 的情况下重新编译插件。这是否可行?

1 个赞

亲爱的 @Ed_Bobkov

如果您确实认为必须如此,可以通过“不受支持的方式”实现您想要的“核心功能”,即:(1) 使用您自己的基础 Discourse Docker 镜像,以及 (2) 使用分叉后的 Discourse GitHub 代码库来构建 Discourse,方法是运行 Discourse 源代码的分叉版本。

在这种情况下,您需要执行以下操作:

请参阅 Discourse Dockerfile 中的这一行:

git clone https://github.com/discourse/discourse.git &&\

以及启动脚本中的这一行:

image="discourse/base:2.0.20200512-1735"

如果您运行的是私有 Docker 注册表,可以将您选择的 Discourse 基础镜像推送到您的私有注册表中,例如:

image="localhost:5000/base:2.0.20200512-1735"

同样,如果您分叉了 Discourse,可以在上述 Dockerfile 中使用该分叉版本,例如:

git clone https://github.com/your_git_account/discourse.git &&\

这将帮助您管理基础 Docker 镜像和构建代码。

当然,我们不推荐这样做,因为您将无法受益于 Discourse 提供的所有错误修复、安全(和功能)更新;而且这种方法既不受支持,也不被推荐。

希望这对您有所帮助,@Ed_Bobkov

注意:采用此方法时,您仍然需要重新构建 Discourse;但您可以控制 (1) 基础 Docker 镜像的版本和 (2) Discourse GitHub 仓库的代码。由于此方法完全不受支持(据我所知),您需“自行承担风险”。

另请参阅:

4 个赞

非常感谢您如此详细的回答!这可不是一个简单的解决办法。奇怪的是,竟然没有一条命令可以在不检查 Discourse 更新的情况下重新编译。

1 个赞

你好 @Ed_Bobkov

嗯,也许确实存在一些我不了解的“其他方法”:slight_smile:这方面我听从其他人的意见。

我之前花了好几天时间研究这个问题,经过多次“试错”后,这是我所能想到的“最佳方案”。

如果有更简单的方法,我非常乐意了解;不过,如果你经常使用 Docker,这样做确实合情合理。

首先,必须构建镜像。Discourse 基于一个基础镜像进行构建并对其进行修改。当你在生产环境(Docker)中添加新插件时,通常需要重新构建容器。因此,我才会像上面那样回复。

这里有很多人在 Discourse 系统管理方面的专业知识远超于我,所以也许其他人能提出更符合你需求的更好建议。

祝好!

4 个赞

如果您的目标仅仅是更新插件,而更新 Discourse 版本,那么只需通过在线仪表板访问 Docker Manager 的升级控制台,并点击特定插件对应的升级按钮即可,例如:

https://your-site/admin/upgrade

注意事项 #1:我认为这仅适用于公共资源,例如开源插件。对于通过嵌入构建脚本的部署密钥访问的私有资源,您可能需要重新构建整个项目。
注意事项 #2:许多插件更新是为了兼容 Discourse 的最新构建版本而发布的。在大多数情况下,同时升级到最新版本是合理的,因为某些更新可能会破坏与旧版 Discourse 的兼容性,但这取决于您的具体需求。

11 个赞