如何将 monorepo 中的所有子文件夹 package.json 更新为相同版本?

Ins*_*nno 9 npm lerna yarnpkg yarn-workspaces

我有一个包含许多不同前端 React 项目的存储库,它们都有自己的 package.json 文件。

我有四个要求:

  1. 我想让所有这些项目保持在同一个依赖轨道上。(即,我希望我的所有项目都使用每个 npm 包的相同版本)
  2. 我希望能够使用一个“全局”命令将每个 package.json 更新到最新版本。
  3. 理想情况下,我想使用某种经过验证的开源工具,例如 Yarn Workspaces 或 Lerna,而不是使用全局 package.json 文件自行管理这一切。
  4. 我正在使用 Yarn 生态系统。

这些包不需要同时运行。并非每个项目都包含完全相同的依赖项,但所有项目都至少包含一些常见的依赖项(即 React、Webpack、Babel 等)。这些包也是完全私有的,不应在 npm 上发布,而只能在 GitHub 上发布。

我已经对工具进行了一些研究,但我很困惑是否仅使用 Yarn Workspaces 就能解决问题,或者是否有必要使用 Lerna。这是我迄今为止在 Yarn Workspaces 中所做的事情:

文件夹结构:

Repo-root
   Packages
      Project-1
      Project-2
Run Code Online (Sandbox Code Playgroud)

回购根 package.json:

{
   "private": true,
   "name": "example-monorepo",
   "workspaces": ["packages/*"],
   "scripts": {}
}
Run Code Online (Sandbox Code Playgroud)

据我所知,Yarn Workspaces 尝试将所有常见依赖项移至幕后的根 node_modules,但我对如何完成共享依赖项安装和更新到最新版本要求感到困惑。Yarn Workspaces 能否自行满足要求,或者 Lerna 是否需要此功能?在勒纳如何实现这一目标?我是否需要定义一个全局的 package.json“单一事实来源”,或者这些工具是否在幕后自行执行某些版本?Lerna 或 Yarn Workspaces 如何“知道”如何在没有全局版本范围集的情况下将所有单独的 package.json 文件更新到最新版本?(我希望所有项目都相同)

Kyl*_*yle 7

Yarn 有一个升级交互模式,使这变得非常简单。

在你的情况下,你想要cd进入你的 monorepo 的根目录并运行yarn upgrade-interactive --latest

这些包将分为两个列表:您的依赖项和 devDependency,但其他情况下按字母顺序排序。您必须手动选择要升级的每个库,但所有相同的模块都将彼此相邻,无论它们位于哪个子目录中。