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

Posted

技术标签:

【中文标题】使用 Yarn 工作区时,我可以在根工作区中安装每个 devDependency 吗?或者我应该将它们保存在每个单独的工作区中?【英文标题】:When using Yarn workspaces, can I install every devDependency in the root workspace? Or should I keep them in each separate workspace? 【发布时间】:2021-10-01 16:01:06 【问题描述】:

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

例如:

packages
  package1
    package.json
  package2
    package.json
  package3
    package.json
package.json

这里是每个包所需的devDependencies

package1 => external-package-A
package2 => external-package-A
package3 => external-package-A + external-package-B

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

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

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

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

【问题讨论】:

【参考方案1】:

这是我在 Reddit 上找到的。

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

评论 1

还不错。它必须是明确的。

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

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

评论 2

免责声明:我正在努力在公司范围内实施单一回购协议 优步。

两个原因。

如果您分别发布每个包,那就“不好”了。如果你这样做 那,然后当您将其安装在其他地方时,所需的依赖项将 从它的 package.json 中丢失。

如果您在公司范围内的大型 monorepo(或任何大型的 monorepo 足够它有几个独立的团队在单独工作 包),然后升级每个人都依赖的***dep可以 很难登陆,因为它可能需要来自 几十个人,差异可能会以多种方式破坏人们的包裹 测试可能无法捕获(这还不算数之类的东西 不再有活跃维护者的软件包)。

将部门放在顶层是一种称为锁定的策略 依赖,它确实有一些理论上的好处(例如,只有一个 每个直接 dep 的单一版本,因此安装速度更快,CI, 等),但实际上,与 解锁依赖策略(顶层没有依赖)。

【讨论】:

以上是关于使用 Yarn 工作区时,我可以在根工作区中安装每个 devDependency 吗?或者我应该将它们保存在每个单独的工作区中?的主要内容,如果未能解决你的问题,请参考以下文章

升级 yarn 似乎可以工作,但没有,安装了 nvm

使用 Yarn 工作区/nohoist 时,如何控制 Yarn 为依赖项的 peerDependency 选择哪个版本?

AWS CodeBuild 不适用于 Yarn 工作区

如何在其中的包中指定的纱线工作区中安装可执行文件?

如何使用 Yarn 2+ 列出每个公共工作区?

使用 yarn 工作区和 react-router-dom v6 时如何正确继承上下文?