Composer 是一个用于 PHP 依赖管理的工具。它实现了让你声明项目所依赖的库,并帮你完成安装 / 更新过程。

语义化版本

版本格式:主版本号.次版本号.修订号

  • 主版本号:当你做了不兼容的 API 修改,
  • 次版本号:当你做了向下兼容的功能性新增,
  • 修订号 :当你做了向下兼容的问题修正。
    了解更多

版本约束

  • 使用波浪号 ~ 约束符锁定小版本
  • 使用折音号 ^ 约束符锁定大版本
  • 使用 比较操作符通配符锁定版本范围
  • 指定具体的版本号精确版本

案例

使用波浪号~约束符锁定小版本(很实用,也比较安全)
  • ~1.1: 安装>=1.1并且<2.0的版本
  • ~1.1.15:安装>=1.1.15并且<1.2.0的版本

~的作用是允许表达式中最后一位变到最大值

使用折音号^约束符锁定大版本
  • ^1.2.3: >=1.2.3 <2.0.0
  • ^0.3 : >=0.3.3 <0.4.0
  • ^1.2 :任意大于等于1.2的1.x.x版本

^锁定不允许变的第一位主版本号,允许升级版本到安全到版本

使用比较操作符通配符锁定版本范围

通过使用比较操作符直接指定包的范围

  • 比较操作符包括:>>=<<=!=
  • 通配符 *
  • &&|| (不推荐)
指定具体的版本号精确版本

可以指定具体的版本,告诉composer只能安装这个版本

  • =3.14.1:示版本号只能是3.14.1
  • 3.14.1 :也是同样的效果

composer.json 和composer.lock有什么区别?有什么用?

composer.json

保存了项目的组件库名称和版本要求(上文的版本约束表达式)

composer.lock

composer install的时候会生成一个当前加载依赖项的对应的版本号。

composer.lock要不要加入版本管理?

当你进行composer install的时候composer会判断你的composer.lock存不存在,如果存在就根据composer.lock中的版本号来加载依赖如果不存在根据composer.json来生成依赖,并生成lock。

所以说composer.lock用来锁定版本号,用于保持你项目引入依赖的版本一致。如果composer.lock不加入版本库可能会导致 本地项目的某个依赖版本是 5.8.17 但是生产服务器是5.8.30

案例1

laravel-admin 大变更居然发小版本
查看详情

案例2

项目用laravel + django-api开发,接口用 OAuth 认证本地项目开发时没问题,但是项目部署上线就挂掉了,具体排查到的原因是 生产服务器删除了composer.lock 然后执行了composer update 其中一个第三方的依赖更新了版本1.2.2修复了一个安全问题,增加了两个文件,需要手动创建两个加密密钥,但是在本地因为锁定了项目版本是1.2.1没有问题,所以发话所有生产服务器不允许直接composer update

参考资料:

Laravel 社区
swoole微课程
语义化版本 2.0.0
Composer 中文文档