composer install 严格按 composer.lock 还原依赖,不理会 composer.json 变更;若 json 新增包但 lock 未更新,install 会报错“Package not required”或“incompatible packages”,因 lock 缺失对应记录。

composer install 为什么有时不装新包,有时又报错
因为 composer install 默认只读 composer.lock,不看 composer.json 的变更。它本质是“复现已知可工作的依赖快照”,不是“按当前配置重新计算依赖”。如果你改了 composer.json(比如加了个新包),但没运行 composer update 生成新 composer.lock,直接跑 composer install 就会失败,报错类似:Package foo/bar is not required in your composer.json 或 Your lock file does not contain a compatible set of packages。
- 只要
composer.lock存在且校验通过,composer install就严格按它还原依赖树,哪怕composer.json里写了"monolog/monolog": "^2.0",而 lock 里锁的是2.10.0,它就装2.10.0,不会去挑最新2.x - 如果删掉
composer.lock再 runcomposer install,Composer 会自动 fallback 到composer update行为——这是隐式降级,容易引发线上环境不一致 -
--no-lock参数能强制忽略 lock 文件,但仅限调试,CI/生产环境禁用
什么时候必须用 composer update 而不是 install
composer update 是唯一能更新 composer.lock 的命令。它会重新解析 composer.json 中的约束、查询 packagist、执行依赖求解,再写入新 lock 文件。常见必须用它的场景:
- 你手动修改了
composer.json的版本约束(比如把"phpunit/phpunit": "9.5.*"改成"^9.6") - 你想升级某个包到满足约束的最新小版本(如从
symfony/console v5.4.32升到v5.4.40),且确认兼容性 - 团队协作中,别人提交了新的
composer.lock,你git pull后发现本地 vendor 不匹配,此时应composer install(不是 update)——除非你也要同步别人的依赖变更
注意:composer update 默认更新所有包,风险高;更安全的做法是 composer update vendor/package-name 指定更新单个包。
composer.lock 文件里到底存了什么
composer.lock 不是简单列表,而是完整依赖快照,含三类关键信息:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
locked packages:每个包的精确版本(如
"version": "3.4.5")、源类型(dist或source)、dist URL 和 SHA256 校验和(防篡改) -
platform:记录当前生成 lock 的 PHP 版本、扩展(如
"ext-json": "*"),用于跨环境兼容性检查 -
content-hash:基于
composer.json内容生成的哈希值,一旦 json 变动而 lock 未更新,install 就报错
这意味着:同一份 composer.lock 在 PHP 8.1 环境下生成,放到 PHP 7.4 环境运行 composer install 可能失败——因为 platform 声明不匹配。
CI/CD 和部署时该用 install 还是 update
生产环境和 CI 流水线必须用 composer install --no-dev --optimize-autoloader。原因很实际:
-
--no-dev跳过require-dev包(如 phpunit),减小体积、避免泄露测试工具 -
--optimize-autoloader生成 class-map,提升加载性能(尤其对大量小文件的项目) - 绝对不要在部署脚本里写
composer update——这等于把依赖决策权交给部署时刻的 packagist 状态,可能引入未测试的版本,导致故障 - 若需更新依赖,应在开发分支完成
composer update→ 提交新composer.lock→ 合并后部署,流程闭环才可控
一个容易被忽略的细节:composer install 在无网络时仍可工作(只要 lock 文件完整、dist 包缓存存在),而 composer update 必须联网;这点在离线构建或 air-gapped 环境里尤为关键。

















