Nodejs 请问怎么强制一个项目的 node_modules 下的任何级别的子模块都使用指定的 node-gyp 版本?

发布于 1周前 作者 h691938207 来自 nodejs/Nestjs

Nodejs 请问怎么强制一个项目的 node_modules 下的任何级别的子模块都使用指定的 node-gyp 版本?

我在使用 npm 安装 electron-rebuild 时,总会在安装它的依赖 lzma-native 时报错:

“Undefined variable module_path in binding.gyp while trying to load binding.gyp”

但如果我自己安装最新的 node-gyp,再安装 electron-rebuild 所依赖的相同版本 lzma-native 就一切正常,

我试图使用一些办法强制指定 node-gyp 版本,比如把 node-gyp 全局安装或安装在项目下,然后再用网传的魔法命令 npm config set node-gyp "<node-gyp.js path>"指定版本,都依然无法避免 electron-rebuild 一意孤行的使用它的低版本 node-gyp,请问有什么办法指定 node-gyp 的版本吗?

难道必须换掉 npm ?


2 回复

用 yarn 的话可以在 package.json 里指定 resolutions 强制所有包用某个版本的依赖。
{
“resolutions”: {
“**/eslint”: “6.0.0”
}
}

用 npm 的话可以装一个包 npm-force-resolutions,效果是一样的


在 Node.js 项目中,确保所有子模块使用指定的 node-gyp 版本可以通过以下几种方法实现。最直接的方法是使用 nvm(Node Version Manager)和 npmscripts 配置。以下是一个具体的实现方案:

  1. 安装 nvmnvm 可以帮助你管理多个 Node.js 版本,确保每个项目使用合适的版本。

  2. 设置 .nvmrc 文件:在项目根目录下创建一个 .nvmrc 文件,指定所需的 Node.js 版本。

    # .nvmrc
    v14.17.0
    
  3. 使用 npm 脚本:在 package.json 中添加自定义脚本,确保使用特定版本的 node-gyp

    {
      "scripts": {
        "install": "nvm use && npm install node-gyp@<specific-version> && npx node-gyp configure && npm install"
      }
    }
    

    替换 <specific-version> 为你需要的 node-gyp 版本。

  4. 运行安装:运行 npm install 时,上述脚本会先切换到指定的 Node.js 版本,然后安装指定版本的 node-gyp,并在全局配置 node-gyp,最后继续正常的 npm install

这种方法确保了在安装项目依赖时,任何需要 node-gyp 的子模块都会使用你指定的 node-gyp 版本。注意,这种方法依赖于 nvm 的正确配置和安装。

另外,使用 Docker 容器来管理依赖也是一种推荐的方法,可以确保每个开发者和生产环境的一致性。

回到顶部