composer.lock 锁文件

前几天 CI/CD 自动部署一个 PHP (Laravel 框架),这是一个 C端主项目,发生了几处问题引起的思考再这里与大家分享一下,主要有以下两点:

  1. 生产环境的 composer.lock 锁文件要不要加入版本控制
  2. 生产环境升级 composer 版本到 2.0 后的感受

目前我司的C端这个项目的 composer.lock 是忽略的(未加入到版本控制) 优点:这样做的原因还是懒,每次升级或安装了新的依赖库,再本地 composer install 后的无需关心的锁文件,多人开发时,每个人的锁文件也不会因为更新时间问题提交上来造成冲突(因为忽略文件不用提交),code review 时也关心不到,但是这样有个隐藏的问题。

缺点:就是生产环境CI/CD 执行 composer install 时,因为代码库里没有 composer.lock 的约束,每次部署项目执行安装依赖命令 composer install 都有可能造成小版本的更新,这会就造成开发环境、测试环境、生产环境,会存在使用不同版本的的代码包,导致的结果便是,开发、测试都好好的,以上生产后哐哐的报错预警。

截止目前我们已经处理两起这类事情:

  1. 因 symfony/mime 库的更新,如下图

mime

将 jpeg 与 jpg 类型的索引互换了一下,在 Laravel 框架的图片验证类,还没有做更新导致中介端的所有此类型的图片均上传不了,「George」经过查找在 Laravel 6.x 版本,修复了此问题。

laravel

  1. 还有一次是 laravel/passport 扩展包,依赖的 lcobucci/jwt 包默默的更新了,导致生产的环境触发报警,用户不能正常登录。

laravel

解决版本,composer.json 文件约束了 lcobucci/jwt 的版本得以解决。如图

laravel

类似这样的问题,未来还会有,但是如果想做到尽可能提前知道,保持环境一致还是很有必要的,接下来我们的做法会考虑将锁文件 composer.lock 加入版本控制。

composer 2.0 体验

聊聊另外一个话题,使用 composer 2.0 的体验

本周(周四、周五)阿里云的 composer 镜像源莫名的抽风,导致个别依赖包 404,CI/CD 自动部署多次重试失败,一怒之下,取消了阿里云 composer 源,CI/CD 再执行 composer install 时,因为执行时间超过了 300s,导致部署失败,这就尴尬了,手动尝试一下,慢的给个拖油瓶一样。国内源挂了,国外源又慢的很,总不能抛弃CI/CD 手动发版?做惯了汽车谁还愿意蹬自行车,婶可忍叔不可忍,前端时间 George 已将本地 composer 版本从 1.x 升级到了 2 ,说速度极快。

果断尝试一下,以下是升级记录(很容易),而且也支持回退(放心干)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
## 当前版本
➜  ~ composer --version
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Composer version 1.8.5 2019-04-09 17:46:47

## 升级
➜  ~ composer self-update
Updating to version 2.0.8 (stable channel).
   Downloading (100%)         
Use composer self-update --rollback to return to version 1.8.5

## 升级后版本
➜  ~ composer --version  
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]? yes
Composer version 2.0.8 2020-12-03 17:20:38

~优点:~使用最明显的感受就是速度极快,以及内存开销也小了,以下是开发测试耗时对比示意图:

laravel

目前 composer 2.1 支持 PHP5.3 据说在 composer 2.2 之后将放弃对 PHP 7.1.3 之前的版本支持。

Finally I want to thank everyone who contributed and helped make this a reality. The 2.0 release represents over 1100 commits from 28 people, 150+ GitHub issues and pull requests, plus everyone who test it, reviewed PRs, etc. It has been a huge effort with the first commits made about two years ago.

参考链接