我想使用“咕哝-贡献-茉莉花”NPM包。它有各种依赖关系。依赖关系图的一部分是这样的:

─┬ grunt-contrib-jasmine@0.4.1
 │ ├─┬ grunt-lib-phantomjs@0.2.0
 │ │ ├─┬ phantomjs@1.8.2-2

不幸的是,这个版本的phantomjs有一个错误,阻止它在Mac OS x上正确安装。这在最新版本中得到了修复。

我怎么能让grunt-lib-phantomjs使用一个新的版本的phantomjs?

一些附加上下文:

Grunt-contrib-jasmine明确要求版本为“~0.2.0”的grunt-lib-phantomjs,它明确要求版本为“~1.8.1”的phantomjs。 首先将phantomjs添加到包的依赖项中没有效果;两个版本都安装了,而unt-contrib-jasmine仍然使用旧版本(参见:当使用NPM安装一个包时,你可以告诉它使用一个依赖项的不同版本吗?)


当前回答

对于使用纱线的人。

我尝试使用npm收缩膜,直到我发现纱线cli忽略了我的npm收缩膜。json文件。

Yarn有https://yarnpkg.com/lang/en/docs/selective-version-resolutions/。整洁。

看看这个答案:https://stackoverflow.com/a/41082766/3051080

其他回答

从npm cli v8.3.0(2021-12-09)开始,这个问题可以使用package.json的overrides字段来解决。正如StriplingWarrior的回答所描述的那样

例如,该项目有typescript 4.6.2版本作为直接开发依赖,而awesome-typescript-loader使用旧版本2.7的typescript。下面是如何告诉npm使用awesome-typescript-loader的typescript 4.6.2版本:

{
  "name": "myproject",
  "version": "0.0.0",
  "scripts": ...
  "dependencies": ...
  "devDependencies": {
    "typescript": "~4.6.2",
    "awesome-typescript-loader": "^5.2.1",
    ...
  },
  "overrides": {
    "awesome-typescript-loader": {
      "typescript": "$typescript"
    }
  }
}

如果你不使用typescript作为直接的开发依赖项,那么你必须在overrides部分写4.6.2而不是$typescript:

{
  "name": "myproject",
  "version": "0.0.0",
  "scripts": ...
  "dependencies": ...
  "devDependencies": {
    "awesome-typescript-loader": "^5.2.1",
    ...
  },
  "overrides": {
    "awesome-typescript-loader": {
      "typescript": "~4.6.2"
    }
  }
}

使用最新版本的依赖项:

{
  "name": "myproject",
  "version": "0.0.0",
  "scripts": ...
  "dependencies": ...
  "devDependencies": {
    "awesome-typescript-loader": "^5.2.1",
    ...
  },
  "overrides": {
    "awesome-typescript-loader": {
      "typescript": "latest"
    }
  }
}

同样的重写可以用于依赖和devDependencies。


如果你正在使用npm版本>5但<8.3.0:编辑你的包锁。Json:从“要求”部分删除库,并将其添加到“依赖项”下。

例如,您希望deglob包使用glob包3.2.11版本而不是当前版本。你打开包裹锁。Json,参见:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "glob": "7.1.2",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  }
},

删除"glob": "7.1.2",从"requires"中删除"glob": "7.1.2",添加"dependencies",版本合适:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  },
  "dependencies": {
    "glob": {
      "version": "3.2.11"
    }
  }
},

现在删除你的node_modules文件夹,运行npm ci(或npm install旧版本的node/npm),它会将缺失的部分添加到“依赖项”部分。


先运行这个

npm i -D @types/eslint@8.4.3

这将解决问题

我有一个问题,其中一个嵌套依赖项有npm审计漏洞,但我仍然想维护父依赖项版本。npm的收缩膜解决方案不适合我,所以我所做的是覆盖嵌套的依赖版本:

删除package-lock.json中'requires'部分下的嵌套依赖项 在包的DevDependencies下添加更新的依赖项。Json,这样需要它的模块仍然能够访问它。 npm我

你可以使用npm shrinkwrap功能,以覆盖任何依赖项或子依赖项。

我刚在我们的一个小项目里做过这个。从2.7.3开始,我们需要一个更新的connect版本。给我们带来了麻烦。所以我创建了一个名为npm-shrinkwrap.json的文件:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "grunt-contrib-connect@0.3.0",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "connect@~2.7.3"
        }
      }
    }
  }
}

NPM应该在为项目安装时自动拾取它。

(参见:https://nodejs.org/en/blog/npm/managing-node-js-dependencies-with-shrinkwrap/)

唯一适合我的解决方案(节点12。npm 6.x)使用了@Rogerio Chaves开发的npm-force-resolution。

首先,通过以下方法安装:

npm install npm-force-resolutions --save-dev

如果某些损坏的传递依赖脚本阻止您安装任何东西,您可以添加——ignore-scripts。

然后是包装。Json定义什么依赖应该被覆盖(你必须设置准确的版本号):

"resolutions": {
  "your-dependency-name": "1.23.4"
}

在“脚本”部分添加新的preinstall条目:

"preinstall": "npm-force-resolutions",

现在,npm install将应用更改,并强制your- dependencies -name为所有依赖项的1.23.4版本。