npm能够匹配直接和传递依赖的非精确版本。
https://npmjs.org/doc/misc/semver.html
作为示例,如果您依赖于v1.2.3的模块/库,并将package.json中的此依赖关系声明为
"foo": "~1.2.3"
使用~
字符,您可以在foo
之前解析任何版本的1.3.0
,包括标记为-beta
的任何版本。
有没有办法禁用这种松散/模糊匹配,以便依赖性解析更加一致?
例如,如果上述依赖关系到位,则解析的版本将始终为1.2.3。
最重要的是,这也需要适用于传递依赖。
答案 0 :(得分:3)
我认为npm shrinkwrap正是您所寻找的。一旦您有一组已安装的依赖关系要冻结以进行部署,请运行npm shrinkwrap
并将所有版本的整个依赖关系树锁定到位。
这是一个有点新功能(2012年2月,好吧不是新的)我还没有看到那么多采用,但正式这是你的问题的解决方案。人们采取的另一种方法是永远不要在其依赖版本中使用任何通配符:“1.2.3”,这对于应用程序来说已经足够了,但对可重用模块不满意。
关于npm shrinkwrap背后原因的更多细节在the blog post from when it was announced。
答案 1 :(得分:0)
默认情况下,npm使用^安装软件包,这意味着任何版本在同一主要范围内,您可以使用--save-exact来切换此行为。
这仅适用于父依赖项,对于您需要使用npm shrinkwrap或yarn lock文件的子依赖项。
// npm
npm install --save --save-exact react
// yarn
yarn add --exact react
我创建了一篇关于保存确切的博客文章,如果有人在将来找这个。
https://www.dalejefferson.com/blog/how-to-save-exact-npm-package-versions/