Yarn Workspaces 是仅存在于一个工作空间中的提升模块

Posted

技术标签:

【中文标题】Yarn Workspaces 是仅存在于一个工作空间中的提升模块【英文标题】:Yarn Workspaces is hoisting modules that exist in only one workspace 【发布时间】:2021-05-05 03:08:44 【问题描述】:

我正在尝试在我的项目中实现纱线工作区 + lerna。我有一个简单的结构:

--package.json
--node_modules/
--@app/
    |--client/
       |--package.json
       |--node_modules/
    |--server/
       |--package.json
       |--node_modules/
    |--db/
       |--package.json
       |--node_modules/

其中 client/ 是 React-Native 应用。我知道 react-native 中的问题,并已将我的根 /package.json 修改如下:

  "workspaces": 
    "packages": [
      "@app/*"
    ],
    "nohoist": [
      "**/react-native",
      "**/react-native/**",
    ]
  ,

据我了解,这应该会阻止 react native 本身以及任何 react-native 的依赖项被提升。但是,我正在经历的是像 react-native-linear-gradientreact-native-reanimated (仅存在于 client/package.json 中)这样的 react-native 库正在被提升并安装在根级别 node_modules。甚至不仅仅是本地模块被提升。 javascript 依赖项也被提升:

本地基础 react-redux @apollo 样式化组件

当然,nohoist 选项甚至不应该在这里发挥作用,因为这些模块只在 client/ 目录中使用。

那为什么要吊到根呢?

为了更好地衡量,我删除了每个工作区中的yarn.lock 文件,只保留了根级别。在运行lerna cleanrm -rf node_modules 之后,我已经在根级别运行了yarn install

有趣的是,此安装非常长(3-5 分钟)。仅删除根级别node_modules 甚至需要大约 20 秒。我完全不确定这对于纱线工作区+lerna 是否正常。

其他详情

纱线版本​​ - 1.22.10

【问题讨论】:

【参考方案1】:

我遇到的是 react-native-linear-gradient 和 react-native-reanimated 等 react-native 库(仅存在于 client/package.json 中)被提升并安装在根级别 node_modules

这是预期的行为,因为它们不是 react-native 的依赖项。您必须指定很多模式,例如:

"nohoist": [
  "**/react-native",
  "**/react-native/**",
  "**/react-native*",
  "**/native-base",
  "**/react-redux",
  // OMG...
]

为了匹配它们...

我实际上会建议简单地添加这个:

"workspaces":  "nohoist": "**"  

client/package.json 文件。

这将导致client 包的所有 依赖项安装在client/node_modules 中——就好像它是一个独立的 React Native 项目,其父级没有工作区一样。

否则,在添加新包(以及尤其是本机模块包)时,您必须时刻保持警惕——您的nohoist 模式是否反映了您添加的所有库?

此外,自动链接和提升也存在问题。

在更笼统和可悲的情况下,我想说 Yarn Workspaces 的重复数据删除功能被高估了。它只是略微减少了磁盘空间的使用,并且只使用 nohoist 一切可能更简单,并且仅在真正出色的情况下使用 Workspaces - 以便于本地包链接。

【讨论】:

那么在这种情况下,clients/ 目录是否会有自己的yarn.lock @Tycholiz 不!它将作为一个正常的工作区工作,但所有 clients 依赖项的源将位于 client/node_modules

以上是关于Yarn Workspaces 是仅存在于一个工作空间中的提升模块的主要内容,如果未能解决你的问题,请参考以下文章

Yarn Workspaces 和 Browserify - 子文件夹中的 package.json 会破坏构建

Yarn Workspaces 和 Webpack 热模块重新加载 React App

如何在 Lerna + Yarn Workspaces repo 中安装 npm 包?

如何使用 Yarn 定位单个工作区?

Yarn工作区

[CLI] Create a Single-Command Node.js CLI with Oclif, TypeScript and Yarn Workspaces