[yarn] How to use multiple versions of one module in workspaces
![[yarn] How to use multiple versions of one module in workspaces](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1605152174361%2FOQ3HhTrte.png&w=3840&q=75)
在 yarn workspaces 同时使用同一个库的不同版本
在项目中,我们的项目结构很有可能是下面的情况:
.
├── packages
│ ├── module-a
│ │ └── package.json
│ ├── module-b
│ │ └── package.json
│ └── share
│ │ └── package.json (react-dnd@3.0.0)
└── package.json (react-dnd@9.3.0)
我们有三个 worksapce,分别是 module-a module-b share,module-a/module-b 都依赖了根目录下的 react-dnd@9,而 share 则依赖了 react-dnd@3.
在 build 时,share 下的代码如果出现了 import { DndProvider } from ‘react-dnd’ 类似内容的话,被打包的会是根目录下的 node_modules/react-dnd@9,而不是 share/node_modules/react-dnd@3.
根据我的个人理解,因为 workspace 是把所有的依赖都放到了项目根目录下,即使你在 share 下的 package.json 声明了你需要的 react-dnd@3,在打包时得到的依然会是根目录下的 react-dnd@9
如何处理这种情况呢?聪明的同学可能已经想到了,我们使用 yarn 的特性同时安装两个版本的 react-dnd 就好了。
yarn add react-dnd-v3@npm:react-dnd@3.0.0
然后把引用旧版本的 react-dnd 都修改为 react-dnd-v3
一般情况下到这里,上面的问题就应该解决了,可是我们还有问题。
react-dnd@3 和 react-dnd@9 都依赖了 hoist-non-react-statics,而前者需要的是 2.x,后者需要的是 3.x!
这种情况下我们就需要把 share/node_modules 与根目录下的 node_modules 隔离开了,让 share 下保留 react-dnd@3,根目录下保留 react-dnd@9,同时将它们各自的依赖安装在自己的 node_module 下
再查了一下文档,发现了 [nohoist](https://yarnpkg.com/blog/2018/02/15/nohoist/)
...
"name": "app",
"private": true,
"workspaces": {
"packages": [
"packages/share",
"packages/module-a",
"packages/module-b"
],
"nohoist": ["share/react-dnd", "share/react-dnd/**"]
}
...
完成上述步骤就 ok 啦
](https://cdn-images-1.medium.com/max/2000/0*1jwc9XiYkHEmUn5z.png)


