composer install 严格按 composer.lock 安装确定版本,不计算依赖;update 则无视 lock,重新运行求解器,可能引发整树重算与行为变更。

composer install 是“照单发货”,update 是“重新选货”
根本区别不在功能描述,而在执行逻辑:install 只读 composer.lock,不做任何版本计算;update 则完全无视 lock 文件,重新跑一遍依赖求解器(Solver),哪怕只是升级一个补丁版本,也可能触发整棵树的重算。
常见错误现象:Your lock file does not contain a compatible set of packages —— 这不是 install 报错,而是你本地 composer.json 和 composer.lock 不一致时的明确警告。别急着 composer update,先确认是不是别人改了 json 没提交 lock,或你自己删过 lock 文件。
- install 快(毫秒级 I/O)、确定(结果唯一)、安全(不引入新行为)
- update 慢(尤其依赖多时可能卡住几秒到几十秒)、不确定(Solver 可能回溯多次才收敛)、有风险(哪怕 minor 升级也可能破坏私有方法调用或默认配置)
- 两者都不该在 CI/CD 脚本里加
--ignore-platform-reqs来绕过报错——那是掩盖问题,不是修复
上线部署和团队协作必须用 composer install
CI 流水线、生产环境部署脚本、新同事拉代码后第一件事,都只能是 composer install。它不关心 composer.json 里写的 "^2.0" 还是 "~3.1",只认 lock 里记录的 "monolog/monolog": "2.8.1"。
如果项目里没有 composer.lock,install 会退化为按 composer.json 解析并生成 lock——但这只该发生在全新项目初始化阶段,不是日常操作。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- git clone 后直接
composer install,别手抖敲update - CI 配置里写死
composer install --no-dev(生产环境不装 dev 依赖) - 团队中有人改了
composer.json,必须连同新composer.lock一起提交,否则别人install会失败
composer update 只用于有明确目标的主动升级
update 不是“保持项目最新”的常规动作,而是带目的的维护行为:修安全漏洞、用某个新特性、适配 PHP 版本升级。它本质是一次受控的破坏性操作,必须人工审查变更。
示例:composer update monolog/monolog 只升这个包及其满足约束的子依赖;composer update --dry-run 先看会装哪些版本,再决定是否真执行;composer update --with-all-dependencies 会连带更新所有间接依赖,风险更高。
- 全局
composer update应该只在上线前统一做,且必须确认新composer.lock已提交 - 日常开发中新增依赖,优先用
composer require vendor/package,它会自动触发一次最小范围的 update 并更新 lock - Laravel 9 项目里升
symfony/console到 v7,可能导致php artisan直接报错——这种事 update 时不会提醒你,但 install 绝对不会发生
什么时候会触发 install 的“降级”行为?
composer install 本身不降级,但它会严格还原 lock 文件里记录的版本。如果你的 lock 记录的是 "laravel/framework": "9.48.0",而你现在想用 9.52.0,install 不会帮你升——它只会装 9.48.0。
反过来,如果 lock 里是 "9.52.0",但你的 composer.json 写的是 "^9.40",你删掉 lock 后跑 install,它就会按 json 解析出最新兼容版(比如 9.52.0),然后生成新 lock。这不是“升级”,是 fallback 到无 lock 状态下的默认行为。
- 真正需要降级时,得手动改
composer.json的版本约束,再composer update(并仔细验证) - CI 脚本里误写成
composer update而非install,会导致每次构建拿到不同版本——这种错误很难复现,但线上行为会漂移 - lock 文件是二进制安全的唯一锚点,删它之前,先问自己:我真需要放弃确定性吗?










