使用工作区的nohoist仍会出现模块提升问题

29

在我的 Monorepo 中,我有一个包,我希望它的所有依赖项都在其 node_modules 中。

但是,无论我做什么,它的 node_modules 都保持为空。

所以,为了解决我的问题,我使用以下设置重现了该问题。

/
 package.json
 lerna.json
 node_modules
 packages/
          A/
            node_modules
            package.json
            index.ts
          B/
            node_modules
            package.json
            index.ts

我已经为此创建了一个存储库

主要的 package.json

{
  "name": "A-B-test",
  "private": true,
  "workspaces": {
    "packages": ["packages/*"],
    "nohoist": [ "**/B" ]
  },
  ...
  "devDependencies": {
    "lerna": "^3.13.4"
  }
}

B/package.json 看起来像是

{
  "name": "@scaljeri/B",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "angular": "^1.7.8"
  },
  "devDependencies": {
    "browserify": "^16.2.3",
    "typescript": "^3.5.2"
  }
}

现在当我在项目的根目录中运行yarn时,所有依赖项都会安装在根目录下的node_modules中。

yarn版本:1.16.0 node版本:12.4.0

有什么建议可能是问题所在?


1
对于任何使用 Yarn 2 或更高版本的人:"workspaces.nohoist" 已被替换为 "installConfig.hoistingLimits"。https://yarnpkg.com/configuration/manifest#installConfig - Andre Brdoch
5个回答

41

根据我的经验,以下方式需要将每个包都进行双重指定:

{
  "nohoist": [
    "**/B",
    "**/B/**",
    "**/C",
    "**/C/**"
  ]
}

此外,在修改nohoist设置后,我发现有必要删除所有现有的 node_modules文件夹。因此,如果您的项目位于packages中,并且您正在项目目录中,可以像这样删除所有这些node_modules文件夹:

# delete node_modules on linux
rm -rf ./packages/*/node_modules
rm -rf ./node_modules

# install again
yarn install --check-files

2
我还必须删除我的 yarn.lock 文件,以使 Yarn 不向上提升一个软件包。 - Dan Hedgecock
1
你还可以通过 lerna clean 清理所有包的节点模块,从而选择要真正清理的模块。 - quirimmo

21

我尝试了几个选项,但最终对我有用的是在子包中指定nohoist选项。 在根级别不需要指定任何内容。
因此,我在B包的package.json文件中添加了以下内容:

{
...

  "workspaces": {
    "nohoist": ["**"]
  },

...
}

2
以上的方法都对我没用。 - leLabrador
此外,为了使其正常工作,包应该具有私有属性:"true"。 - undefined

5

将nohoist应用于子包的package.json对我有帮助。

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

1
这是唯一在yarn 1.22中有效的解决方案。谢谢! - Arian Acosta
2
这对我没有用(1.22.4)。Yarn显示了一个错误,因为子包不是“private”。 - Matthias

0
如果您想排除软件包B节点模块在hoisting时,您可以在package.json文件中实现:
  "workspaces": {
    "nohoist": [
      "**/B",
      "**/B/**"
    ]
  },

之后删除 node_modulesyarn.lock 文件,然后再次运行 yarn install 命令,现在你应该看到 packages/B/node_modules 不再被提升到项目的顶层。


0
在yarn 3.6.4上,唯一有效的方法是在我的根目录的.yarnrc.yml文件中添加nmHoistingLimits: workspaces

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接