# [yarn] How to use multiple versions of one module in workspaces


在 yarn workspaces 同时使用同一个库的不同版本

![[https://yarnpkg.com](https://cdn.hashnode.com/res/hashnode/image/upload/v1605152172533/T0Ht0g7H3.html)](https://cdn-images-1.medium.com/max/2000/0*1jwc9XiYkHEmUn5z.png)*[https://yarnpkg.com](https://yarnpkg.com/en/)*

在项目中，我们的项目结构很有可能是下面的情况：

```
.

├── 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 的特性](https://yarnpkg.com/lang/en/docs/cli/add/#toc-yarn-add-alias)同时安装两个版本的 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 啦
