composer.lock 是依赖版本的唯一权威记录,必须提交至 Git 并严格区分 install(按 lock 安装)与 update(重解依赖并更新 lock);CI/CD、新环境部署及协作开发均须优先执行 install,修改依赖后需 update 并提交新 lock。

只要团队里有人删了 composer.lock 或手动改了 composer.json 后没跑 composer install,版本就大概率不一致——不是“可能”,是“一定”会出问题。
为什么 composer install 和 composer update 必须分清
这是最常翻车的第一步。composer install 读 composer.lock 装固定版本;composer update 忽略 lock 文件,按 composer.json 的约束重新解析依赖树,生成新 lock。CI/CD、上线部署、新同事拉代码后第一件事,都必须是 composer install,不是 composer update。
- 本地开发想升级某个包?先
composer update vendor/package-name,再提交更新后的composer.lock - CI 脚本里写
composer update?等于主动放弃版本控制,CI 构建结果不可复现 -
composer.json里写"monolog/monolog": "^2.0",lock 文件里锁的是2.9.1,那所有人装出来的就是2.9.1,不是最新2.x
composer.lock 必须进 Git,且不能被忽略
它不是“缓存文件”,是依赖快照的唯一权威记录。不提交 lock,等于没锁版本。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 检查 .gitignore 是否误写了
composer.lock或*lock* - 新项目初始化后,第一次
composer install就该立刻git add composer.lock - 多人协作时,如果 A 提交了 lock,B 拉下来后改了
composer.json却直接composer install,会报错:Your requirements could not be resolved to an installable set of packages.—— 因为 lock 里没对应记录,这时 B 应该先composer update(并提交新 lock),而不是删 lock 再装
不同 PHP 版本或平台导致 lock 不兼容怎么办
composer.lock 默认包含平台配置(如 php、ext-zip),如果团队有人用 PHP 8.1,有人用 8.2,而某包在两个版本下解析出的依赖路径不同,lock 就可能失效。
- 检查 lock 文件顶部的
platform字段,建议显式声明团队统一的最小 PHP 版本,例如:"config": {"platform": {"php": "8.1.0"}} - 避免在
composer.json中写过于宽松的 PHP 约束,比如"^7.4 || ^8.0",这会让 Composer 在不同环境下选不同分支,lock 失去意义 - Windows 和 Linux 下某些扩展名(如
ext-sockets)默认状态不同,若项目依赖这类扩展,应在config.platform中统一模拟,否则 lock 在 CI(Linux)上通过,本地(Win)却装不上
真正难的不是记命令,而是让所有人理解:lock 文件不是“生成物”,它是和 composer.json 平级的源码——改它,要像改业务逻辑一样走评审、测试、合入流程。漏掉一次提交,或某人手抖执行了 update,后面排查环境差异的时间,远超花三分钟看一眼 lock 是否已提交。

















