当我们将依赖于gulp@3.9.1
的旧项目更新到Node.js 12+时,我们遇到了相同的问题。
这些修复程序使您能够通过覆盖graceful-fs
版本为^4.2.11
来使用Node.js 12+与gulp@3.9.1
。
如果您正在使用pnpm
pnpm
支持覆盖某些依赖项版本。要执行此操作,您应在package.json文件中添加一个pnpm
部分:
{
"pnpm": {
"overrides": {
"graceful-fs": "^4.2.11"
}
}
}
如果您正在使用yarn v1
yarn v1 支持将软件包解析为定义的版本。
您需要向package.json
添加一个resolutions
部分:
{
"resolutions": {
"graceful-fs": "^4.2.11"
}
}
感谢@jazd提供的解决问题的方法。
如果您正在使用npm
运行此命令以了解您正在使用哪个版本的Node.js:
node -v
它将返回一个版本号
<major>.<minor>.<patch>
,例如
18.11.0
。
如果你的版本是 v16.14.0 或以上,则可以通过在 package.json 文件中添加
一个overrides
部分 来覆盖
graceful-fs
版本:
{
"overrides": {
"graceful-fs": "^4.2.11"
}
}
否则,您需要使用
npm-force-resolutions
作为预安装脚本,以能够通过更改您的 package.json 文件来覆盖
graceful-fs
的版本,如下所示:
{
"scripts": {
"preinstall": "npx npm-force-resolutions"
},
"resolutions": {
"graceful-fs": "^4.2.11"
}
}
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
依赖 graceful-fs@^3.0.0
,后者对 Node.js 的 fs
模块进行了 monkeypatch。
这在 Node.js 版本 11.15 之前是可行的(这是一个来自开发分支的版本,不应该用于生产环境)。
graceful-fs@^4.0.0
不再对 Node.js fs
模块进行 monkeypatch,这使它与 Node.js > 11.15 兼容(已测试并适用于版本 12、14、16、18 和 20)。
请注意,这不是永久性的解决方案,但在您没有时间更新到 gulp@^4.0.0
时,它会有所帮助。