Discourse core 正在切换到 pnpm 进行 JS 包管理

我们将 Discourse core 的 JS 包管理器从 ‘yarn classic’ 切换到 pnpm。这将显著提高安装速度和存储要求。

Production

如果您使用托管服务或标准安装,则无需执行任何操作。更改将在您下次更新时自动应用。

如果您有自定义的生产环境,则需要将所有 yarn ... 命令更改为 pnpm ...

Development

拉取 Discourse core 的最新版本后,在启动服务器时可能会看到类似以下的错误:

pnpm is not installed

或者,如果您运行 yarn install 等命令,您会看到:

error discourse@: The engine "yarn" is incompatible with this module. Expected version "please-use-pnpm". Got "..."

要解决此问题,您应该:

  1. 运行 npm install -g pnpm
  2. 运行 pnpm install
  3. 将开发环境中的所有 yarn ... 用法替换为 pnpm ...

Plugins / Themes

我们已将官方插件/主题切换为使用 pnpm 来处理其 linting 依赖项。

对于 discourse_theme CLI,您需要通过运行 gem update discourse_theme 来更新本地版本。

切换回 yarn

如果您需要切换回基于 yarn 的 Discourse 版本(例如,在 stable 分支上进行开发),则需要手动删除 core 的所有 node_modules 目录:

rm -rf node_modules app/assets/javascripts/*/node_modules
24 个赞

在开发环境中可以报告一次完美流畅的体验,一次成功,非常感谢! :rocket:

7 个赞

如果您是自托管的。如果我们不使用自定义组件和插件,是否需要执行任何操作?

例如,某些插件和组件不是官方的。

3 个赞

如果您使用的是我们的标准安装,则无需执行任何操作。插件或主题无需更改。

5 个赞

我们应该将此预期版本更改为,也许:

please-use-pnpm-see-https://meta.discourse.org/t/324521

:smiley:

6 个赞

我正在为另一个 FOSS 项目做贡献,最近我第一次接触到了 PNPM。这次过渡非常简单、顺利、有效,而且非常愉快。

我为该项目的文档写了一些非常简短的笔记,介绍了 PNPM 是什么以及如何使用它。虽然每个项目的细节都略有不同,但我希望这些内容能为像我一样在公告发布前一无所知的人提供一个快速的介绍。

5 个赞

好资源,谢谢 @TonyG

值得注意的是——那里没有一个“配置说明”是 Discourse 所必需的。不确定为什么他们需要它……也许因为它是一个基于 Windows 的应用程序?

另外,他们关于“在现有项目中,只需删除‘node_modules’文件夹”的说明在 Discourse 中会自动处理 通过这个脚本 :sunglasses:

所以对我们来说,它确实应该很简单:

npm install -g pnpm
pnpm install
1 个赞

David,这里有个问题:

如何在本地运行 linting?

即,什么可以替代,例如:yarn prettier --write plugins/discourse-events

我尝试运行

pnpm pprettier --write plugins/discourse-events

但它抛出了一个错误:

Error: File not found with singular glob: /Users/blah/dev/disc/discourse/plugins/discourse-events (if this was purposeful, use allowEmpty option)

你是不是多了两个 p

所以你想要的是:

pnpm prettier --write plugins/discourse-events

pprettier 是一个用于并行运行 prettier 的工具,但我猜它不支持像这样在单个目录上运行。

3 个赞

感谢您为 FOSS 文档做出的贡献,@david :lol_: 看起来该页面确实是面向 Windows 的,而且那里的信息可能是使用 pnpm 所必需的知识。我将进行编辑并澄清这两种情况都不是该实用程序的实际情况。

需要明确的是,关于 pnpm 如何工作的这些信息仅是为了方便用户/开发者,包括那些可能想了解这个取代了我们工具包中一个重要、常用工具的新工具的开发者。

对于 Discourse 的开发者来说,这些信息解释了事物的存放位置以及如何更改默认位置。这旨在回答诸如“如果我所有的 node_modules 都集中在一个位置,它们在哪里?”之类的问题。在 Discourse 容器中,你们开发者可能不希望将包放在默认位置。如果出于任何原因,插件开发者直接引用 node_modules 文件夹,并且发现链接指向另一个位置而不是文件,那么该页面上的信息将简洁地解释该位置是如何确定的。

所以,我试图简短地说明一下。:facepalm: :lolsob:

总之,迁移到 pnpm 是个好举措,谢谢。

2 个赞

是的,pprettier 不合适,谢谢。

我也解决了我的最终问题。

你似乎需要在插件目录中运行 pnpm install,然后才能运行 linting 检查(即使是从 discourse 目录运行)。

2 个赞

嗯,有意思 :thinking:

使用我们的标准插件骨架,每个插件都有自己的 package.json 文件,其中包含其代码检查依赖项。而且目前,骨架仍然使用 yarn

因此,要对特定插件进行代码检查,您需要进入插件目录并运行

yarn install
yarn prettier --write

有时可以使用核心(core)的代码检查配置来处理插件。但是,如果版本/配置不匹配,就会变得很麻烦,因为核心中的 eslint/prettier 版本将与插件 CI 中运行的版本不匹配。

1 个赞

我们是否也应该考虑从插件目录使用 pnpm?

我认为它仍然在使用本地 package.json,对吗?

3 个赞

是的,我们肯定会!只是让核心更改尘埃落定,然后我们开始那次冒险

(有趣的事实:CDCK 维护着近 600 个主题/插件存储库,所有这些都需要更新 :sweat_smile:

2 个赞

好的,没问题!

1 个赞

这似乎已正确工作,但对一条通知感到困惑,该通知似乎说明需要手动执行此操作,并且对于标准安装站点不是自动的:

2 个赞

感谢 @Architect。这些 PR 将会抑制升级消息:

6 个赞

通过 Web 工具升级时遇到问题 — 升级页面显示升级失败,并出现 Expected version \"please-use-pnpm\" 错误,但当我随后再次访问“版本”页面时,升级似乎已成功:

……但是现在所有管理员页面都无法正常工作:

更新:
我在命令行上进行了重建,这解决了问题。

3 个赞

感谢您报告此问题,@alxndr

我刚刚推送了此修复程序,这应该可以阻止其他人遇到此问题。

4 个赞

也许是我们的 Communiteq 环境,但老实说,我在安装过程中没有看到任何显著的速度提升?我们的稳定测试安装甚至比测试通过的安装快 23 秒。

1 个赞