问题描述
我正在尝试将 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-gradient
和 react-native-reanimated
(仅存在于 client/package.json
中)这样的本机库被提升并安装在根级别 node_modules
。甚至不仅仅是被提升的原生模块。 Javascript 依赖项也正在提升:
- 本地基础
- react-redux
- @apollo
- 样式组件
当然,nohoist
选项甚至不应该在这里发挥作用,因为这些模块只在 client/
目录中使用。
那为什么要把它们吊到根部呢?
为了更好的衡量,我删除了每个工作区中的 yarn.lock
文件,仅保留根级别一级。运行 lerna clean
和 rm -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 可能会更简单 - 以便于本地包链接。