我想用grunt-contrib-jasmine
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
我包的相关性第一没有影响; 两个版本的安装和grunt-contrib-jasmine
仍然使用旧版本(参见: ?当NPM安装包,你可以告诉它使用一个不同的版本它的一个依赖的 )。
你可能已经找到了一种解决方法了。
无论如何,你可以使用NPM拆封功能,以覆盖任何依赖关系或子依赖。
我只是在我们的一咕噜项目做到了这一点。 我们需要连接的新版本,因为2.7.3。 是为我们造成麻烦。 所以,我创建了一个名为文件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"
}
}
}
}
}
故宫应该自动把它捡起来,而这样做的安装项目。
(参见: https://nodejs.org/en/blog/npm/managing-node-js-dependencies-with-shrinkwrap/ )
对于那些从2018年以后,使用NPM 5.0或以上版本:编辑你的package-lock.json
:删除从库"requires"
部分,在“依赖性”添加它。
例如,你想deglob
包使用glob
包版本3.2.11
,而不是目前的一个。 你开package-lock.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"
,增加"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 install
,它会丢失部分添加到"dependencies"
部分。
对于使用这些纱。
我试着用NPM拆封,直到我发现了纱线CLI忽视了我的NPM-shrinkwrap.json文件。
纱线具有https://yarnpkg.com/lang/en/docs/selective-version-resolutions/这一点。 整齐。
看看这个答案过于: https://stackoverflow.com/a/41082766/3051080
最简单的是最小的仅添加初始shrinkwrapped依赖JSON来的package.json。 “从”和“到”需要
"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"
}
}
}
你也可以考虑以下方法。
假设你的项目对包A的依赖而这又取决于包B.创建这种依赖关系链: your_project -> Package A -> Package B
。 B中包A依赖于你现在要更新的版本,而不是在一个月中存在包的版本中的错误。
将这些步骤
对于一个新的开始,在开始第1步在步骤3自己的项目开始内工作。
- 创建一个新的临时项目
npm init
- 安装程序包A
npm i A@version --save
- 安装程序包B
npm i B@fixed_version --save
- 打开
package-lock.json
文件和复制包B的整个根级依赖 - 卸载程序包B
npm un B --save
- 取出
node_modules
文件夹和package-lock.json
- 安装所有剩余的依赖
npm i
- 打开
package-lock.json
文件并粘贴前面复制根级别的依赖性。 - 调整程序包A的依赖包B的版本,以固定的版本。
- 取出
node_modules
文件夹。 - 安装无副作用
npm i --no-save
您现在应该看到在你的项目的根级依赖node_modules
与固定版本的文件夹。
注 :我没有检查这对于存在依赖于包B.因此,多根级依赖情况your_project -> Package A -> Package B
和your_project -> Package C -> Package B
。 我怀疑这仍然会工作和套餐C将保持它自己的版本,但我不知道。
为什么做这样的?
使用这些步骤你让故宫做大部分的工作适合你。 举例来说,它也产生了诚信散列包B.
为什么步X?
步骤3:这增加了包B的固定版本作为第一度依赖性和调整当前package-lock.json
。 然而,套餐A仍然有破包版本B的,它保持在自己的依赖node_modules
文件夹。
步骤5:与步骤3相同,除了充分去除包B的
第6步:这需要做的,因为我们希望程序包B是一个全新安装根级依赖。
步骤7:该安装所有的依赖关系,将恢复为“断”的情况,并创建一个package-lock.json
与在根级破碎的版本包B的文件。
步骤10 + 11:这确保了我们模仿一个新的安装。 NPM总是查找package-lock.json
文件,如果没有“node_modules”文件夹。 使用--no-save
确保了不存在的副作用,诸如改变到package-lock.json
文件。