composer install 是确定性还原操作,只按 composer.lock 精确安装已锁定版本,完全忽略 composer.json 的版本约束;composer update 才是依赖求解操作,重新解析 composer.json 并升级至最新兼容版本。

composer install 本来就不该更新依赖包——它只按 composer.lock 还原,不是 update 的替代品。
composer install 和 composer update 的根本区别
install 是确定性还原操作:它完全忽略 composer.json 中的版本约束,只读取 composer.lock 里记录的 exact commit hash 或 dist shasum,然后把 vendor 目录“精准复刻”成 lock 文件描述的状态。哪怕 composer.json 里写着 "monolog/monolog": "^3.0",只要 lock 里锁的是 v3.5.0,install 就只会装 v3.5.0。
update 才是求解操作:它重新读取 composer.json,调用 SAT 求解器,在当前元数据“可见版本池”里重新计算满足所有约束的最新组合,并生成新 lock。
- 你执行
composer install后没看到包变化,大概率是因为 lock 文件没变、vendor 已完整、且没有缺失包 - 如果想升级某个包,必须用
composer update vendor/package,而不是改完composer.json就跑 install - 删掉
composer.lock后直接 runcomposer install会报错:Lock file does not exist. Run composer update to create it.
为什么改了 composer.json 却发现 install 没反应
常见误解是“改完 require 就该生效”,但 install 完全不看 composer.json 的变更。它只做三件事:校验 lock 是否存在 → 校验 vendor 是否已包含 lock 里所有包 → 若有缺失则下载对应 ZIP。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 现象:
composer.json新增了"guzzlehttp/guzzle": "^7.8",但composer install输出Nothing to install or update - 原因:lock 文件里没有这一行,vendor 里自然也没有,但 install 不会主动补上——它只负责“还原”,不负责“补缺”
- 正确做法:先
composer update guzzlehttp/guzzle(生成新 lock),再composer install(在其他环境还原) - 若只想加包不碰其他依赖,用
composer require guzzlehttp/guzzle:^7.8 --no-update+composer update guzzlehttp/guzzle --with-dependencies
误以为 install “卡住”或“失败”的真实原因
真正让 composer install 报错的,几乎全是环境不匹配问题,而不是网络或镜像。它根本不走远程解析,所以不会卡在 Loading composer repositories。
- 报
Your requirements could not be resolved:说明 lock 文件中某包要求 PHP >=8.1,而你本地是 PHP 8.0;或config.platform.php写死为"8.2.10",但实际运行的是 8.1 - 报
Package is not installed:通常因为composer.lock存在但对应包没进 vendor,比如vendor/被 .gitignore 错误排除,或安装中途被 kill - 终端没报错但类找不到:
autoload没生效,检查vendor/autoload.php是否被正确引入,以及composer dump-autoload是否执行过
什么时候该用 install,什么时候必须用 update
CI/CD、线上部署、新同事拉代码后,唯一合法命令是 composer install --no-dev --optimize-autoloader。任何场景下用 composer update 替代 install,等于放弃版本控制权。
- 交付物必须含
composer.lock,且它必须和composer.json一致(git diff应无变更) - 开发阶段改依赖,流程是:
composer require/ 手动改composer.json→composer update xxx→ 提交新的composer.lock - 如果团队共用 lock,但有人本地 PHP 版本低,不要加
--ignore-platform-reqs——应统一环境,否则上线必崩
最常被忽略的一点:install 成功只代表 vendor 目录结构对了,不代表能跑起来。autoload 映射错位、扩展缺失、甚至 .env 配置漏写,都会导致后续命令直接失败——别急着重装,先确认 vendor/autoload.php 被引入且 composer diagnose 无平台告警。










