composer.json 是项目依赖的声明文件,定义所需包及版本范围;composer.lock 是安装快照,记录实际安装的精确版本与哈希值,二者协同确保环境一致。

composer.json 是你项目的依赖“说明书”,而 composer.lock 是实际安装时的“精确快照”。两者配合,才能保证团队里每个人装的包版本完全一致。
composer.json:声明你要什么
这个文件是你手动维护的,写明项目需要哪些包、允许的版本范围(比如 "monolog/monolog": "^2.0"),还包含 autoload、scripts、require-dev 等配置。它不记录具体安装了哪个子版本,只管“大方向”。
- 开发时修改它:加新包、升级主版本、调整约束条件
- 提交到 Git:所有成员都应基于同一份声明来协作
- 不要手动改 version 字段——那是 lock 文件的事
composer.lock:记录你实际拿到什么
每次运行 composer install 或 composer update 后,Composer 自动更新这个文件,里面存着每个包的确切版本号、完整 hash、依赖树结构,甚至 dist 包的下载地址。它让安装过程可重现。
- CI/CD 和生产环境必须用
composer install(而非 update),靠它还原一模一样的依赖 - 这个文件要提交进 Git,且不能忽略
- 如果 lock 文件存在,
composer install就完全忽略 composer.json 中的版本范围,只按 lock 装
协作中常见问题怎么解
团队里有人删了 lock 文件重装?有人直接改了 json 但没跑 update?这些都会导致环境不一致。
- 新人拉代码后,先检查有没有 composer.lock;有就直接
composer install - 要升级依赖,用
composer update vendor/package,别手动改 json 后跳过 update - 合并分支前,留意 lock 文件冲突——优先保留对方的变更,再跑一次
composer update验证 - 用
composer show --outdated定期查看哪些包可安全升级
一句话记住关键逻辑
composer.json 是“我想用哪些包”,composer.lock 是“我这次确实装了哪些包”。前者人写,后者机器管;一个管意图,一个保结果。










