使用 Yarn 工作区时,我可以在根工作区中安装每个 devDependency 吗?或者我应该将它们放在每个单独的工作区中?

cbd*_*per 9 dependency-management package.json yarnpkg yarn-workspaces

使用 Yarn 工作区时,我可以将每个工作区安装devDependency在根工作区中吗?或者我应该将它们放在每个单独的工作区中?

例如:

packages
  package1
    package.json
  package2
    package.json
  package3
    package.json
package.json
Run Code Online (Sandbox Code Playgroud)

这是devDependencies每个包所需的。

package1 => external-package-A
package2 => external-package-A
package3 => external-package-A + external-package-B
Run Code Online (Sandbox Code Playgroud)

external-package-A和应该安装在哪里external-package-B?

external-package-A由于我的所有软件包都使用它,是否应该安装在根工作区中?

external-package-B如果我也安装在我的根工作区中会有什么问题吗?

或者我应该将它们安装在每个包中?我的意思是它们将列在package.json每个包的每个相应文件中,而不是列在根文件中。

cbd*_*per 5

这是我在 Reddit 上找到的内容。

https://www.reddit.com/r/javascript/comments/9t6yht/yarn_workspaces_why_is_adding_something_to_the/

评论 1

不算太差。它必须是明确的。

例如,您有软件包 A。它依赖于外部依赖项 B。如果您将 B 安装到 root 中,您将使软件包 A 在工作区中工作,但安装时它将失败。所有开发依赖项(不单独从工作区调用)都可以毫无问题地安装到根目录。

例如,我们在每个工作空间中都有 babel(不同包中的不同版本),但在 root 中却有 eslint。我们正在努力实现统一的构建过程,因此 babel 也将迁移到根 deps。

评论2

免责声明:我正在 Uber 致力于实施全公司范围内的 monorepo。

有两个原因。

如果您单独发布每个包,这是“糟糕的”。如果这样做,那么当您在其他地方安装它时,其 package.json 中将缺少所需的依赖项。

如果您处于大型公司范围的单一存储库(或任何足够大的单一存储库中,有多个单独的团队处理不同的软件包),那么升级每个人都依赖的顶级 dep 可能会非常困难,因为它可能需要来自数十人的代码审查,差异可能会以测试可能无法捕获的方式破坏人们的包(并且这还不包括不再有活跃维护者的包之类的东西)。

将 deps 放在顶层是一种称为锁定依赖项的策略,它确实有一些理论上的好处(例如,每个直接 dep 只有一个版本,因此安装、CI 等更快),但在实践中,维护成本非常昂贵,与未锁定的依赖策略(顶层没有依赖项)相比。