使用NPM / Node / package.json修订控制和依赖关系解决scheme

我们还没有在应用程序中将node_modules文件夹提交到版本控制。 我们的构buildstream程和开发者指令包括在初始检查时手动运行“npm install”以安装所需的节点模块。 我们的package.json文件详细说明了特定的依赖版本。

最近,我们的自动化构build破坏了,因为最近的第三方提交了一个下游依赖项,我认为这是不可能的。 我们的package.json文件如下:

{ "name": "test-package", "description": "Test Package", "version": "1.0.0", "license": "UNLICENSED", "private": true, "repository": { "type": "svn", "url": "" }, "dependencies": { "extend": "3.0.0", "windows-registry": "0.1.3" } } 

具体来说,我们对“windows-registry”版本“0.1.3”的依赖打破了,因为该模块的子依赖(“ref”version“1.2.0”)。 “windows-registry”package.json文件的依赖关系如下:

 "dependencies": { "debug": "^2.2.0", "ffi": "^2.0.0", "ref": "^1.2.0", "ref-struct": "^1.0.2", "ref-union": "^1.0.0" } 

我会假设“Windowsregistry”总是引用“ref”包的版本“1.2.0”,但实际上拉着版本“1.3.4”,然后最近“1.3.5”打破了我们的构build。 我在package.json文件中validation了“ref”,它不是版本“1.2.0”。 “ref”的package.json文件很大,文件内各个键下面有很多值,比如“ref@^1.2.0”。 package.json文件中有趣的部分如下:

 { /* Lots of other stuff */ "_spec": "ref@^1.2.0", "version": "1.3.4" } 

为什么NPM不加载相同的可重复依赖关系图? 我们应该将node_modules提交给我们的版本控制吗?

看到这个答案:

用最简单的术语来说,代字符与最近的次版本(中间数字)匹配。 〜1.2.3将匹配所有的1.2.x版本,但会错过1.3.0。

另一方面,插入符号更轻松。 它会将您更新到最新的主要版本(第一个数字)。 ^ 1.2.3将匹配包括1.3.0在内的任何1.xx版本,但会在2.0.0版本上延期。

至于你的其他问题:你绝对应该提交你的node_modules文件夹。 你应该提交一个package-lock.json文件,它会冻结你的依赖关系。 通常使用shrinkwrap命令来执行此操作,但是在npm v5中,默认情况下会生成locking文件

我也build议寻找yarn ,这是一个npm兼容的包pipe理器,更好,更快地pipe理复杂的依赖关系树

最后,由于npm存储库或多或less地强制执行,所以有助于了解每个增量在破坏和非破坏性改变方面的含义。 就你而言,如果程序包作者遵循语义版本控制,则这些更改应该是向后兼容的:

给定版本号MAJOR.MINOR.PATCH,增加:

  • MAJOR版本,当您进行不兼容的API更改时,
  • MINOR版本,当您以向后兼容的方式添加function时
  • 当您进行向后兼容的错误修复时,修补程序版本。