composer.lock的实际作用
前段时间在公司开发时,出现了本地的ampq扩展没有问题,但是发布到线上之后出现找不到类的错误,当时一脸懵逼,于是去看jenkins的部署log,发现shell脚本执行了一个composer install命令,之前确实没用过这个命令,往往都是缺少的包用composer require包含进来,然后直接写完代码push上去,也没出过问题。
于是去composer官网查了下文档,原来composer update是将当前所有的依赖包都更新到最新版本,如果使用这个的话会导致旧的代码可能因为包版本不兼容出问题,所以部署时为了避免出现这种情况,除了在compsoer.json中配置require-dev之外,线上都会执行一下composer install命令。而我们本地开发 的时候,在用require包含新的包之后将当前的包信息锁定到composer.lock文件中,这样每次部署的时候都执行一个composer install命令,保证包版本兼容。
团队开发时,为了避免新版本的包不兼容旧的代码,一般按照如下步骤操作:
- 删除掉composer.lock文件
- 在compoer.json添加新的依赖包(或者composer require)
- composer install
- 将代码push到git
- 部署时线上shell脚本也运行composer install(此时lock里只有新增的依赖包,旧的依赖包仍是旧版本)
下面是一些composer的常用命令:
composer 使用默认php版本
php composer 使用指定php版本
php composer update 获取依赖最新版本,并升级composer.lock文件 (--no-dev 参数只更新require下的包不更新require-dev里的包)
php composer install 如果有composer.lock文件根据该文件安装,否则根据composer.json
composer dumpautoload 更改composer.json后重新加载(--optimize或-o 映射到map优化加载速度)
自动加载原理:https://segmentfault.com/a/1190000014948542
官方文档:https://docs.phpcomposer.com/03-cli.html#install
Packagist:https://packagist.org/