关于package.json 和package-lock.json

每日鸡汤,每个你想要学习的念头都是未来的你向自己求救

一直在纠结,每次pull 完代码之后重新install , package-lock.json就改变了,那么我改完代码之后需要把这个package-lock.json提交么?

前置知识:项目的版本号

 让我们先来来看看package.json

  1. 每个包前面的 ^  代表 大版本的依赖包^1.2.3中的1
  2. ~ 代表次要版本号(小版本) ~1.2.3中的2
  3. 如果什么符号都不加,则是指定版本,这也就是说的锁定版本,好处是避免包更新带来的bug,但是关于锁定版本也有一些坑,可以看一下这篇文章
  4. 使用 npm install xx@1.1.1  这个命令,可以指定安装xx的1.1.1这个版本,安装成功后在package-lock.json中xx的版本就是1.1.1,但是需要注意的是,在package.json中它会自动给你加一个 ^  
    1. 比如,我运行了 npm install node-sass@4.14.0 -D 这个命令,结果如下
    2. 所以要注意,指定版本安装之后,并不能锁定版本,还需要手动删一下 ^
  5. 如果不指定版本安装,在package.json中也会自动增加 ^ ,同时会更新小版本最新的包【多数的时候都不会指定版本,因为,我们需要一个依赖肯定多数都是npm install a 这样。所以在自动加了^的时候,会造成本本不同导致的问题
  6. 如果一个包后面写的 * ,代表着安装最新版本,也就是大版本可以更新,通常我们的项目不会这么写,但是我们看下packag-lock.json中别人的包就很常见,比如这个
  7. 在 执行npm install 之后,会生成一个package-lock.json的文件

接下来我们看看package-lock.json文件是啥 参考

package-lock.json是当node_modules或package.json发生变化时自动生成的文件,这个文件主要功能是确定当前安装的包的依赖,以便后续重新安装的时候生成相同的依赖,而忽略项目开发过程中有些以来已经发生的更新

  • npm install 之后会计算每个包的sha1值,然后将包与他的sha1值关联保存再package-lock.json里面
  • 下次npm install的时候会根据package-lock.json里面保存的sha值去npm缓存中找文件,如果存在,就不用在册从网上下载安装包

看看官方怎么说,package-lock.json

  1. 结论是,如果你安装了一个新的包,需要上传到git, 保证其他人在npm install时大家的依赖能保持一致

参考内容

  1. npm 提供自动生成package-lock.json功能,为的是让开发者知道只要你保存了源文件,到一个新的机器上、或新的下载源,只要按照这个package-lock.json所标示的具体版本下载依赖库包,就能确保所有库包与你上次安装的完全一样
  2. package.json锁定大版本号, lock标示具体版本
  3. 有bug的时候 ,指定版本号更新依赖 , npm install xxx@1.1.1.   lock文件也会更新(这个时候,别忘了上传git 哦)
  4. 从git上更新了package.json 和lock文件,直接npm install 可以覆盖掉node_modules 里面的依赖。所以两个文件有更新,你pull完之后应该 npm install 一下

又一个问题是,如果你和别人用的镜像不同,也会影响lock文件比如这种,因为一个人用了淘宝镜像,这种情况其实lock文件也是可以提交的

但是如果版本没有改,也不用提交也行,以后再纠结用不用提交的时候,看看版本有没有变化,没变化就不提交了也行,别怕,我经常不提交,没出事

具体问题,具体分析。
参考内容https://segmentfault.com/a/1190000022414965

当查看某个依赖包的版本时,在package-lock里面看,因为package.json锁定大版本, 除非锁定版本?

你看这个,实际项目用的版本是lock中的5.7.1

lock 文件实际是为了,在不同的环境下生成相同的node_modules 【不同的环境指的是你的电脑、同事的电脑。。。】

  1. 如果只有一个package.json文件,运行npm i 会生成package-lock.json文件,这个文件相当于本次install的一个快照,它不仅记录了package.json指明的直接依赖版本,也记录了间接依赖版本【间接依赖版本,是安装的依赖的依赖】比如下面这种
  2. 如果package-lock.json版本在package.json指定版本范围内,即使package.json中有新的版本,执行npm i  会根据package-lock.json 下载响应版本比如上上图安装的是5.7.1
  3. 如果lock 是5.5.2 package.json是6.2.2, 二者版本不兼容,npm i  ,lock会更新到兼容package.json 的版本,6.2.2或者6.4.4等等【取决于有没有锁定版本】

哈哈哈 终于找到关于不同镜像导致lock文件不一致的问题了

  1. 不要使用cnpm ,因为cnpm 不支持版本锁定,就是说使用cnpm 不会根据lock文件的版本去install, 只会根据package.json文件安装
    1. 2023年4月24日更新,这一点是重中之重,我遇到了一个问题,在运行dockerfile的时候,由于使用了cnpm,但是它没有按照lock文件安装,所以总是失败,因为根本没有锁定版本,但是cnpm依旧会遵守 没有 ^ 就不更新小版本的规则。
  2.  npm 和cnpm的区别
    1. cnpm 不会根据 lock 下载相应版本
    2. cnpm 指定版本isntall , install x@3.3 不会更新lock文件
    3. cnpm 是淘宝搞的npm官方的一个镜像,就是一个官方的只读版本,和官方的同步频率是10分钟一次,我还以为很久
    4. cnpm 服务器在国内
  3. 切换npm 镜像, 注意这里切换的只是镜像(镜像就是一个官方或者淘宝等下载路径是一个url),命令还是需要用npm
  4. 切换镜像,要么用原始的命令,npm config set registry url 要么使用nrm
  5.  什么是nrm ,nrm ls 查看可选的源,
    1. nrm 是一个npm 源管理器,就是管理npm包来源的网址, 但是也得用npm 来安装,npm i -g(全局安装global) nrm
    2. nrm use xx / nrm add xx / nrm del xx
  6. 居然还可以nrm test taobao 测试某个源的响应时间

所以 上面说的对,不改变版本号的 lock 文件可以不提交, 但是提交也完全没问题,要不以后就提交吧

  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值