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

问题描述

我正在尝试将 yarn 工作区 + 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 中)这样的本机库被提升并安装在根级别 node_modules。甚至不仅仅是被提升的原生模块。 Javascript 依赖项也正在提升:

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

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

那为什么要把它们吊到根部呢?

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

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

其他详细信息

纱线版本​​ - 1.22.10

解决方法

我所经历的是像 react-native-linear-gradient 和 react-native-reanimated(仅存在于 client/package.json 中)这样的 react-native 库被提升并安装在根级 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 可能会更简单 - 以便于本地包链接。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...