我想使用“咕哝-贡献-茉莉花”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子依赖项。关于你为什么想要这样做的详细信息,请参考以下问题:

如何重写一个嵌套的npm子依赖与完全不同的包(不仅仅是不同的包版本号)?

直接指定tarball

对于使用其他人提到的npm-force-resolutions策略将一个包嵌套替换为一个完全不同的包,您只需要提供一个指向tarball的链接,通常在该链接中指定覆盖版本号。

以替换易受攻击的包ansi-html为例,使用此包的固定分支ansi-html-community,即包的决议部分。Json应该是这样的:

"resolutions": {
    "ansi-html": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz"
}

要找到到tarball的链接,使用以下命令,并根据需要修改注册表:

npm view ansi-html-community dist.tarball --registry=https://registry.npmjs.org/

另外,要让npm-force-resolutions在你运行npm install时正常工作,你需要在package.json的scripts部分下有一个preinstall入口:

  "scripts": {
    "preinstall": "npx npm-force-resolutions"
  }

其他回答

用完全不同的包进行嵌套替换

如果你只是对覆盖包的版本号感兴趣,其他答案中列出的大多数策略都很有效,但在我们的例子中,我们需要找到一种方法,用不同的包覆盖嵌套的npm子依赖项。关于你为什么想要这样做的详细信息,请参考以下问题:

如何重写一个嵌套的npm子依赖与完全不同的包(不仅仅是不同的包版本号)?

直接指定tarball

对于使用其他人提到的npm-force-resolutions策略将一个包嵌套替换为一个完全不同的包,您只需要提供一个指向tarball的链接,通常在该链接中指定覆盖版本号。

以替换易受攻击的包ansi-html为例,使用此包的固定分支ansi-html-community,即包的决议部分。Json应该是这样的:

"resolutions": {
    "ansi-html": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz"
}

要找到到tarball的链接,使用以下命令,并根据需要修改注册表:

npm view ansi-html-community dist.tarball --registry=https://registry.npmjs.org/

另外,要让npm-force-resolutions在你运行npm install时正常工作,你需要在package.json的scripts部分下有一个preinstall入口:

  "scripts": {
    "preinstall": "npx npm-force-resolutions"
  }

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

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

对于使用纱线的人。

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

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

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

唯一适合我的解决方案(节点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版本。

我本来打算采用npm-force-resolution方法,但似乎只需要将依赖项包含在自己的包中就可以了。Json为我解决了这个问题。

我相信这在我的案例中是有效的,因为原始依赖项允许我想要更新的依赖项的补丁版本。因此,通过手动包含一个新版本,它仍然满足原始依赖项的依赖,并将使用我手动添加的依赖项。

例子

问题

我需要将plyr从3.6.8版本升级到3.6.9版本

Mine

package.json

{
  "dependencies": {
    "react-plyr": "^3.2.0"
  }
}

反应Plyr

package.json

{
  "dependencies": {
    "plyr": "^3.6.8"
  }
}

注意,对于plyr依赖,它以^开头,这意味着它可以接受任何小补丁。你可以在这里了解更多: https://docs.npmjs.com/about-semantic-versioning#using-semantic-versioning-to-specify-update-types-your-package-can-accept

更新我的

这将更新package.json中的plyr依赖。

package.json

{
  "dependencies": {
    "plyr": "^3.6.9",
    "react-plyr": "^3.2.0"
  }
}