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

Tyc*_*liz 4 react-native lerna yarnpkg yarn-workspaces

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

--package.json
--node_modules/
--@app/
    |--client/
       |--package.json
       |--node_modules/
    |--server/
       |--package.json
       |--node_modules/
    |--db/
       |--package.json
       |--node_modules/
Run Code Online (Sandbox Code Playgroud)

其中 client/ 是React-Native应用程序。我知道react-native中的陷阱,并修改了我的根,/package.json如下所示:

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

Run Code Online (Sandbox Code Playgroud)

据我了解,这应该可以防止 React Native 本身以及 React-Native 的任何依赖项被提升。react-native-linear-gradient然而,我所经历的是像和react-native-reanimated(仅存在于)之类的反应本机库client/package.json正在根级别提升和安装node_modules。被提升的甚至不仅仅是原生模块。Javascript 依赖关系也被提升:

  • 本地基础
  • 反应还原
  • @阿波罗
  • 样式组件

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

那么为什么他们会被吊到根上呢?

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

有趣的是,这个安装时间非常长(3-5 分钟)。甚至光是去除根层就需要20秒左右node_modules。我完全不确定这对于纱线工作区+lerna 是否正常。

额外细节

纱线版本 - 1.22.10

iva*_*lev 14

\n

我所经历的是,react-native 库,如react-native-linear-gradient 和react-native-reanimated(仅存在于client/package.json 中)正在被提升并安装在根级别node_modules

\n
\n

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

\n
"nohoist": [\n  "**/react-native",\n  "**/react-native/**",\n  "**/react-native*",\n  "**/native-base",\n  "**/react-redux",\n  // OMG...\n]\n
Run Code Online (Sandbox Code Playgroud)\n

匹配他们所有人...

\n

我实际上建议简单地添加以下内容:

\n
"workspaces": { "nohoist": "**" } \n
Run Code Online (Sandbox Code Playgroud)\n

client/package.json文件。

\n

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

\n

否则,在一般情况下添加新包(尤其是本机模块包)时,您必须时刻保持警惕\xe2\x80\x93 您的nohoist模式是否反映了您添加的所有库?

\n

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

\n

从更普遍和可悲的角度来看,我想说 Yarn Workspaces 的重复数据删除功能被高估了。nohoist它仅略微减少了磁盘空间的使用,并且仅在真正发挥 \xe2\x80\x93 的作用以方便本地包链接的情况下使用工作区可能会更简单。

\n

  • @Tycholiz 不!它将全部作为普通工作区工作,但所有“客户端依赖项”源将位于“client/node_modules”中 (2认同)