使用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时
- 当您进行向后兼容的错误修复时,修补程序版本。