如何稳定{Node} npm依赖系统?

我正在使用angular-cli并使用Angular2构build一个SPA。 我有一个Jenkins构build系统,在我的应用程序中,每当我的项目存储库发生变化时,都会触发一个基本上删除整个node_modules文件夹的构build,然后执行npm install ,然后执行构build过程。 所有这些都是在Linux机器上远程完成的。

问题:
现在我面临的问题是二级和三级依赖问题。 大多数依赖(如果不是全部)我使用npm安装有自己的packagae.json文件,这反过来有自己的,等等。 所以,即使我通过删除插入符号或波形符号来冻结我的主package.json文件中的版本,我也无法控制二级和三级依赖项的版本。 这导致了很多UNMET PEER DEPENDENCY错误,因为一个依赖需要同一个组件的一个版本,而另一个需要另一个版本!

题:
所以我的问题是,我如何确保这不会发生,并实现稳定的依赖安装?

你可以保持你的package.json不变,然后运行npm shrinkwrap ,它会创build一个新的文件npm-shrinkwrap.json ,并在你运行的时候安装所有包层次结构的确切版本。

如果你提交这个文件,下一次你运行npm install ,npm应该检测这个文件并且尊重它。

文档:
https://docs.npmjs.com/cli/shrinkwrap

PS

Facebook的yarn npm客户端(类似于本地npm工具的工具)的另一个相似的工作方式是。

它使用自己的yarn.lock文件,并且它快速地caching了它自己的共享caching中的依赖关系,使得下一个安装速度更快。

但是对于构build服务器上的用例,可能难以设置它。 这就是为什么我强调npm本身的答案。