composer install 无视 composer.json 修改是因为它只读取 composer.lock 进行精确还原,不解析版本约束;改 json 必须执行 composer update 才能更新 lock 文件并生效。

composer install 为什么无视你刚改的 composer.json?
因为 composer install 默认只读 composer.lock,不解析 composer.json —— 它不是“按需安装”,而是“按锁还原”。你改了 composer.json 但没删锁文件,Composer 就当什么都没发生。
- 只有
composer.lock存在时,install才生效;它里面记录的是上次update或require算出来的精确版本和哈希值 -
composer.json的修改(比如新增包、改版本约束)**必须**触发composer update或composer require才会写入 lock 文件 - 如果 lock 文件里没有你要的包或版本,
install直接报错Package xxx not found,不会 fallback 到 json 去猜 - CI/CD 中常见误操作:git checkout 后直接
composer install,但 lock 文件未随分支更新,导致装错版本
怎么确认 composer.json 的改动真被用了?
别靠感觉,用命令验证。改完 composer.json 后,必须做两件事:
- 运行
composer update vendor/package-name(指定包)或composer update(全量),让 Composer 重新解析依赖并更新composer.lock - 检查
composer.lock是否变化:git diff composer.lock,确认新增/修改的包已写入 - 验证是否生效:
composer show vendor/package-name输出的版本号,必须和composer.lock里packages数组中对应项一致 - 如果只想试效果不改 lock,可用
composer install --dry-run,它会模拟执行但不写文件,输出“would install”列表
为什么删了 composer.lock 还是装旧版本?
不是没删干净,是缓存里还存着旧元数据。Composer 会优先从 ~/.composer/cache 读 packages.json 和 provider-*.json,这些缓存可能指向旧镜像或过期索引,导致解析结果和你预期不符。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 删 lock 后务必清缓存:
composer clear-cache(Composer ≥ 2.5 推荐加--refresh) - 如果换过镜像源,还要确认
composer config -g repo.packagist输出的是镜像地址,且 URL 末尾有/ - 某些 CI 环境(如 GitHub Actions)默认启用缓存,需显式配置 cache key 包含
composer.lock的 hash,否则旧缓存会被复用 - Windows 用户注意 BOM:用
file -i composer.json检查编码,BOM 会导致 Composer 解析失败,表面看文件存在,实际跳过读取
项目级配置和全局配置打架怎么办?
项目根目录下的 composer.json 本身不控制镜像源,镜像由 repositories 字段定义——但这个字段可以被全局配置覆盖,也可能被 Docker 或宝塔的运行用户隔离。
- 先查生效的是哪个配置:
composer config --list | grep repositories,看输出里repo.packagist或repositories.packagist.org是否出现且值正确 - 全局配置(
~/.composer/config.json)对所有项目有效,但容器内以www-data身份运行时,它读的是/var/www/.composer/config.json,不是你本地的 - 更稳妥的做法是项目级写死:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/(不加-g),它会直接写进当前项目的composer.json的repositories字段 - 写完立刻验证:
composer install -vvv 2>&1 | grep "Downloading",确保域名是镜像站,不是packagist.org
真正容易被忽略的是:lock 文件的哈希校验和 platform 配置。哪怕所有路径、权限、镜像都对,如果 config.platform.php 写成 "8.1" 而不是 "8.1.10",Composer 仍会按你本地 PHP 版本去算依赖,导致线上装的包和本地不一致。










