必须由明确需变更者运行composer update生成或更新composer.lock,他人仅用install复现;因install依赖lock文件,而lock缺失或过期时install会退化为update,导致各环境版本不一致甚至线上故障。

因为 composer install 只照 composer.lock 装,而 composer.lock 必须由某人先跑 composer update(或 composer require)生成或更新——否则别人根本没法用 install 复现一致环境。
为什么不能跳过 update 直接让所有人 install?
项目刚初始化或新增依赖时,composer.lock 文件往往不存在,或者内容已过期。此时执行 composer install 会退化为 composer update 行为:它会读 composer.json、自行解析最新兼容版本、装包、生成新 lock 文件——但这个过程在不同机器上可能因平台差异、缓存、网络顺序等产生微小偏差,导致实际安装的版本不完全一致。
- 比如
"phpunit/phpunit": "^9.5"在 A 机装出9.5.27,B 机装出9.5.28,看似小版本差异,却可能触发 PHPUnit 内部行为变更(如数据提供器返回值处理逻辑) - 更隐蔽的是:某些包的子依赖(如
sebastian/exporter)会被间接拉取不同 patch 版本,最终影响测试断言或覆盖率报告
谁该跑 update?什么时候跑?
只有明确需要引入变更的人才该运行 composer update,且必须立刻提交更新后的 composer.lock 到 Git。常见场景:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 你加了一个新包:
composer require monolog/monolog—— 它内部自动调用update并写入lock,直接 commit 即可 - 你要升级某个包修复安全漏洞:
composer update monolog/monolog --with-dependencies,再git add composer.lock - 你改了
composer.json里的约束(比如把"^2.0"改成"^3.0"),必须手动composer update monolog/monolog来触发重解析,不能只改 json 就提交
绝对不要裸跑 composer update(不带包名),尤其在团队项目里——它会连带升级所有依赖,极易引发隐性不兼容。
其他人为什么只能 install?
composer install 的唯一职责是“复现”,不是“决策”。只要 composer.lock 存在且已提交,它就严格按里面记录的每个包的精确版本(包括 hash)、安装路径、autoloader 映射来还原环境。
- CI/CD 流水线、生产服务器、新入职同事的本地机器——都靠这个机制保证“所见即所得”
- 如果有人漏提交
composer.lock,或误删后自己跑update再 commit,就会导致其他人install出来的 vendor 目录和预期不一致,轻则 Class not found,重则路由注册失败、中间件顺序错乱 -
composer install --no-dev --optimize-autoloader是部署标配,它跳过开发依赖、生成优化过的 autoloader,而这些动作在update里不会自动发生
真正容易被忽略的点是:lock 文件不是“一次生成就永远有效”。每次 composer.json 变动、PHP 版本升级、甚至某些扩展(如 ext-intl)启用状态变化,都可能让现有 lock 文件失效——这时报错 Your lock file does not contain a compatible set of packages 不是让你绕过去,而是提醒你:必须由负责人重新 update 并提交新 lock,其他人再 install。










