必须提交composer.lock,它是确保团队安装完全相同依赖版本的唯一依据;它记录精确版本、校验和、源类型及完整依赖树,缺失将导致环境不一致、ci失败或运行时错误。

为什么 composer.lock 必须提交到 Git
多人协作时,composer.lock 文件不是可选的——它是确保所有人安装完全相同依赖版本的唯一依据。如果只提交 composer.json,不同人执行 composer install 时可能因本地缓存、Packagist 响应顺序或 Composer 版本差异,装上不一致的次要版本(比如 A 装了 monolog/monolog 2.10.0,B 装了 2.11.0),导致行为不一致甚至运行时错误。
关键点:
-
composer.lock记录了每个包的精确版本、校验和、源类型(dist / source)及完整依赖树,是可重现安装的“快照” - 团队必须约定:所有
composer update后,composer.lock变更必须随代码一起提交 - CI/CD 流程中应强制使用
composer install --no-dev(生产环境)或composer install(测试环境),而非update
合并分支时如何避免依赖冲突
最常见场景:feature-A 分支执行了 composer require package-a,feature-B 分支执行了 composer require package-b,两者都修改了 composer.json 和 composer.lock。Git 合并时若直接接受双方变更,composer.lock 很可能损坏或不一致。
安全做法:
- 不要手动编辑
composer.lock—— 它是生成文件,不是配置文件 - 合并后先检查
composer.lock是否有 Git 冲突标记(如)。若有,说明已损坏,需重建 - 正确流程:保留合并后的
composer.json,删除当前composer.lock,再运行composer install重新生成(它会严格按composer.json解析并锁定) - 若需保留某一分支的 lock 状态(如稳定基线),可用
git checkout --ours composer.lock或--theirs,再补全缺失依赖
如何快速定位“谁引入了某个包”
当发现项目里存在一个你不认识的包(比如 symfony/polyfill-mbstring),或者想确认某包是否被间接引入导致冲突,不能靠翻 composer.json —— 它可能来自子依赖。
用 composer why 直接查来源:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
composer why symfony/polyfill-mbstring
输出类似:
yiisoft/yii2 2.0.48 requires symfony/polyfill-mbstring (^1.23)
还可加 -r 查递归链:composer why -r monolog/monolog,看到从根依赖到它的每一层路径。这对排查“为什么装了旧版 guzzlehttp/guzzle”特别有用。
开发环境与生产环境的依赖隔离
很多人误以为 --dev 只是“开发时才装”,其实它影响的是依赖解析逻辑和最终安装内容。
注意以下三点:
-
require-dev中的包(如phpunit/phpunit)在composer install --no-dev时完全不下载、不解析,也不会出现在自动加载器中 - 但
require-dev中的包仍参与依赖解析 —— 如果它和require中某个包对同一依赖提出矛盾约束,composer update仍会报错 - 推荐策略:把测试、构建、分析类工具全放
require-dev;生产环境部署脚本必须加--no-dev,且 CI 应验证composer install --no-dev能成功
真正容易被忽略的是:Composer 的依赖解析是全局图遍历,不是逐个安装。哪怕你只改了一行 composer.json,composer update 也可能重排整个依赖树。所以任何变更都要配合 composer.lock 提交,并在团队内同步更新习惯——否则“在我机器上好好的”会反复出现。










