composer install 从不拉新代码,只按 composer.lock 中锁定的精确版本还原 vendor/;若要获取最新代码,需先删除 composer.lock 再运行 install,或使用 composer update 指定包并配合 --no-update-with-dependencies 等参数控制更新范围。

composer install 为什么没拉到最新代码?
因为 composer install 从不拉新代码——它只按 composer.lock 里记录的 exact commit hash 或 dist shasum 去还原 vendor/,哪怕远程仓库已更新几十个 patch 版本,只要 lock 没变,它就原样解压旧缓存或 zip。你看到“没更新”,不是命令失效,而是 lock 文件本身已经锁死了版本源头。
想跳过 lock 强制重拉,但又不想改依赖树?
唯一安全路径是:先删 composer.lock,再跑 composer install。这会让 Composer 忽略历史锁定,重新解析 composer.json 中的版本约束(如 "^2.0"),然后从 Packagist 拉取当前满足约束的最新可用版本,并生成新 lock。
- ⚠️ 注意:这会改变整个依赖树,不只是你想更新的那个包
- 如果只想更新单个包,用
composer update monolog/monolog,它仍受composer.json约束,但不会动其他包 - 加
--force-reinstall(Composer 2.2+)可确保即使版本号不变,也强制重新下载 dist 包(比如修复损坏的 zip)
只更新某个包的代码,不碰 lock、不升级子依赖?
可行,但需两步配合:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 在
composer.json中把目标包写成精确版本号,例如"monolog/monolog": "3.5.0" - 执行
composer update monolog/monolog --no-update-with-dependencies(Composer 2.5+) - 终端输出出现
Downloading行,且vendor/monolog/monolog下文件修改时间刷新,才算真正重拉
漏掉 --no-update-with-dependencies,默认会连带升级它的子依赖(如 psr/log),容易引发隐式变更。
为什么清了 vendor 还是旧代码?
因为 Composer 默认复用本地缓存(~/.composer/cache/)。即使删了 vendor/ 和 composer.lock,它仍可能从缓存快速解压旧 zip,根本没走网络。
- 查缓存位置:
composer config --global cache-dir - 清缓存:
composer clear-cache(别手动rm -rf,会破坏结构) - 再执行安装命令,终端应大量出现
Downloading https://api.github.com/类请求
CI/CD 中最容易忽略这一步——构建日志看似成功,实际产物仍是缓存里的旧二进制。

















