NPM vs PNPM vs Yarn
在开始安装 JavaScript 库之前,您需要选择要使用的包管理器。(我们社区喜欢灵活性和选择,所以当然不止一个!) Rush 支持三种最流行的包管理器。按时间顺序
NPM:开创了今天大多数 JavaScript 包管理器使用的打包标准和注册表协议的工具。该工具的开发者还维护着 npmjs.com 注册表,它目前是分发开源 JavaScript 库的最受欢迎的地方。
Yarn:对 NPM 工具的完整重写,保留了相同的安装模型,但承诺更快的安装速度、更高的可靠性和一些酷炫的新功能(例如 Yarn 工作区),这些功能可以促进大规模开发。
PNPM:一种全新的安装模型,它解决了"幽灵依赖项"和"NPM 重复项"问题,同时巧妙地利用了符号链接来保持与 NodeJS 模块解析标准的 100% 兼容。
我应该在 Rush 中使用哪一个?
答案取决于您的需求。Rush 开发人员并不认可特定的包管理器,但以下是一些基于我们管理自身单体仓库的经验得出的观察结果
关于 NPM 的注意事项
NPM 是最兼容的选择,并且对于处理“错误”包来说是最宽容的。
如果您选择 NPM,您可能需要使用旧版本。NPM 5.x 和 6.x 都是已知的具有未解决的回归问题,这些回归问题会在 Rush 仓库中造成麻烦。NPM **4.5.0** 是已知工作非常可靠的最新版本,但不幸的是它相当旧。(我们非常感谢社区帮助改善这种情况。我们正在使用 GitHub 问题 #886 来跟踪这项工作。)
在报告与 NPM 包管理器相关的 Rush 错误之前,请先尝试降级到
"npmVersion": "4.5.0"
。如果这消除了重现问题,那么您的问题很可能是 NPM 回归问题,可能无法在 Rush 代码库中修复。我们仍然接受这些问题,但我们以不同的方式跟踪它们。
关于 PNPM 的注意事项
PNPM 是唯一可以解决NPM 重复项问题的选项。在一个复杂的单体仓库中,重复项有时会导致很多麻烦,因此 PNPM 在这方面具有重要优势。
尽管 PNPM 的符号链接策略正确遵循现代 NodeJS 模块解析标准,但许多遗留包却没有,这会导致兼容性问题。将现有项目从 Yarn/NPM 迁移到 PNPM 的团队经常会遇到需要解决方法或修复的“错误包”。不兼容性通常反映了这些包的实际问题:(1) 忘记在 **package.json** 文件中列出依赖项,或者 (2) 实现自制模块解析,而没有根据标准处理符号链接。大多数“错误”包都有简单的修复方法,但这对于小型团队来说可能看起来很吓人。(PNPM Discord 聊天室 是一个很好的帮助资源,尽管如此。)
PNPM 比 NPM 或 Yarn 更新且使用范围更小,但它是一个可靠的软件。微软在 Rush 仓库中使用 PNPM,该仓库有数百个项目,每天有数百个 PR,我们发现它非常快且可靠。
PNPM 目前是唯一支持
--strict-peer-dependencies
保护的选项(参见 **rush.json** 中的"strictPeerDependencies"
)。
关于 Yarn 的注意事项
Rush 对 Yarn 的支持相对较新且未经验证,因此我们渴望了解问题并进行修复。
Yarn 的安装速度比 NPM 快(尽管比 PNPM 稍微慢一些)。
Yarn 的“工作区”未在 Rush 仓库中使用,因为它们依赖于一种不保护幽灵依赖项的安装模型。然而,Rush 的链接策略与工作区大体相当。
指定包管理器
要更改您的包管理器,请编辑 **rush.json** 文件并取消注释三个字段中的一个(npmVersion
、pnpmVersion
或 yarnVersion
)
rush.json
/**
* The next field selects which package manager should be installed and determines its version.
* Rush installs its own local copy of the package manager to ensure that your build process
* is fully isolated from whatever tools are present in the local environment.
*
* Specify one of: "pnpmVersion", "npmVersion", or "yarnVersion". See the Rush documentation
* for details about these alternatives.
*/
"pnpmVersion": "2.15.1",
// "npmVersion": "4.5.0",
// "yarnVersion": "1.9.4",
更改设置后,请从 **common/config/rush** 文件夹中删除旧的 shrinkwrap 文件和其他特定于包管理器的文件。(否则 Rush 会抱怨不支持的配置文件。) 然后运行 rush update --full --purge
。就这么简单!