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