宝哥软件园

npm锁定机制分析

编辑:宝哥软件园 来源:互联网 时间:2021-08-22

什么是国家预防机制

Npm是一个包管理工具,开源作者可以在平台上发布开源包供其他人下载使用。前端的同学基本都用过npm,这里就不多介绍了。npm在日常工作中的主要目的是使用npm install根据项目的package.json安装依赖项。

Npm安装可以说是最常用的指令。在npm5之前,npm install将根据package.json指定的依赖版本进行安装,但通常package.json会指定一个版本范围,例如:

dependencies ' : { ' package a ' : ' 2.0.0 ' },上述2.0.0指定的范围是版本号大于等于2 . 0 . 0,主版本号为2。也就是说,2.6.10是一致的,而3.0.0和1.0.0则不是。这样的范围指定会导致一个问题:A创建了一个新项目,生成了上面的package.json文件,但是A的安装时间比较早。此时packageA的最新版本是2.1.0,与代码兼容没有bug。后来B克隆了A的项目,安装依赖项的时候packageA的最新版本是2.2.0,所以npm会根据语义安装2.2.0版本,但是2.2.0版本的API可能会发生变化,导致代码出现bug。

这就是package.json会带来的问题。在不同的时间和环境下安装同一个package.json会产生不同的结果。

理论上不应该出现这个问题,因为npm作为开源世界的一部分,也遵循一个发布原则:同一个大版本号的新版本应该和旧版本兼容。也就是说,当2.1.0升级到2.2.0时,API不应该改变。

但是很多开源库的开发者并没有严格遵守这个发布原则,导致了上面的问题。

锁定机构

解决历史问题的新事物诞生了

基于这种情况,npm5引入了锁机制。当使用npm5.0.0之后的版本时,将在安装npm之后自动生成package-lock.json文件,其中记录了这次安装的依赖版本号。

例如,当package.json依赖于以下内容时:

依赖项' : {'vue' :' 2.0.0'},安装后自动生成的package-lock.json将指定vue版本vue2.6.10(当前最新)的安装

dependencies ' : { ' vue ' : { ' version ' : ' 2 . 6 . 10 ',' resolved ' : ' https://registry . NPM . Taobao . org/vue/download/vue-2 . 6 . 10 . tgz ',Integrity ' : ' sha1-pysaqtykniepdjrtr 9v 5 mgvxjc=' } } package-lock . JSON相当于此安装的快照,它不仅

如果我们希望每次在不同的环境和不同的时间安装相同版本的依赖项,我们可以带上package-lock.json

当package.json和包-lock.json同时存在时,npm install会检查package-lock.json指定的依赖版本是否在package.json指定的范围内,如果是,则安装package-lock.json指定的版本,否则忽略package-lock.json,用安装的新版本号覆盖package-lock.json。

例如:

//package . JSON ' dependencies ' : { ' vue ' : '^2.0.0' }//package-lock . JSON ' dependencies ' : { ' vue ' : { ' version ' : ' 2 . 1 . 0 ',' resolved ' : ' https://registry . NPM . Taobao . org/vue/download/vue-2 . 1 . 0 . tgz ',integrity ' : ' sha1-ktuj 76 rkhgz

//package . JSON ' dependencies ' : { ' vue ' : '^2.2.0' }//package-lock . JSON ' dependencies ' : { ' vue ' : { ' version ' : ' 2 . 1 . 0 ',' resolved ' : ' https://registry . NPM . Taobao . org/vue/download/vue-2 . 1 . 0 . tgz ',integrity ' : ' sha1-ktuj 76 rkhgz

值得注意的是,npm5发布时并没有采用这种安装逻辑。安装逻辑在npm5.0和npm5.6之间多次改变,目前的逻辑从npm5.6开始使用。

npm ci

npm5之后的锁机制满足了需要锁版本的开发人员的需求。我们只需要获得一个package-lock.json就可以知道要安装的依赖项的具体版本号。但是细心的同学会发现,当package-lock.json指定的版本号不在package.json指定的范围内时,package-lock.json就会被更新覆盖。这不利于我们保持版本固定。

因此,国家预防机制也引入了国家预防机制ci的指导来解决这个问题。npm ci和npm i的区别在于,当package-lock.json指定的依赖版本不在package.json指定的依赖版本范围内时,npm将报告错误并取消安装。

这样,当package-lock和包. json不一致时,我们就不怕覆盖和更新了。

摘要

在npm5.6之后,我们可以安全地使用package-lock.json文件来锁定版本,在构建部署时,我们可以使用npm install命令来阻止npm install的覆盖率更新。

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

更多资讯
游戏推荐
更多+