我们在将依赖 gulp@3.9.1 的旧项目更新到 Node.js 12+ 时遇到了同样的问题。
这些修复使您能够通过将graceful-fs 覆盖到版本^4.2.9 来使用带有gulp@3.9.1 的Node.js 12+。
如果你使用的是 yarn v1
纱线 v1 supports resolving a package to a defined version。
您需要将resolutions 部分添加到您的package.json:
{
// Your current package.json contents
"resolutions": {
"graceful-fs": "^4.2.9"
}
}
感谢@jazd以这种方式解决问题。
如果您使用的是 npm >= 8.3.0
npm@^8.3.0 使您能够覆盖项目依赖项的包的版本。为此,您应该在 package.json 中添加 an overrides section:
{
// Your current package.json
"overrides": {
"graceful-fs": "^4.2.9"
}
}
如果你使用 npm
使用npm-force-resolutions 作为预安装脚本,可以获得与使用 yarn v1 类似的结果。您需要以这种方式修改您的 package.json:
{
// Your current package.json
"scripts": {
// Your current package.json scripts
"preinstall": "npx npm-force-resolutions"
},
"resolutions": {
"graceful-fs": "^4.2.9"
}
}
npm-force-resolutions 将在完成install 之前更改package-lock.json 文件以将graceful-fs 设置为所需的版本。
如果您在项目中使用自定义 .npmrc 文件并且它包含代理或自定义注册表,您可能需要将 npx npm-force-resolutions 更改为 npx --userconfig .npmrc npm-force-resolutions,因为到目前为止,npx 不使用默认为当前文件夹.npmrc文件。
问题的根源
这个问题源于 gulp@3.9.1 depends 在 graceful-fs@^3.0.0 上的猴子补丁 Node.js fs 模块。
在 11.15 版本之前,它一直与 Node.js 一起使用(这是来自开发分支的 version,不应在生产中使用)。
graceful-fs@^4.0.0 不再对 Node.js fs 模块进行猴子补丁,这使其与 Node.js > 11.15 兼容(经过测试并与版本 12 和 14 兼容)。
请注意,这不是一个长期的解决方案,但当您没有时间更新到 gulp@^4.0.0 时,它会有所帮助。