composer install 无视 composer.json 修改,只严格按 composer.lock 还原依赖;要使新修改生效,必须运行 composer update(或 composer require)来重算依赖并更新 lock 文件。

改了 composer.json 却发现 composer install 一点反应都没有——这不是 Composer 坏了,而是它严格按设计在工作:它只认 composer.lock,不看 composer.json 里新加的包、改的版本或删掉的依赖。
为什么 composer install 完全无视 composer.json 的修改
composer install 的唯一任务是「还原」:用 composer.lock 里记录的每个包名、精确版本、哈希值和 dist URL,把 vendor/ 目录恢复成一模一样的状态。它压根不解析 composer.json 的内容。
- 你往
require里加了"monolog/monolog": "^3.0"?install看不见 - 你把
"guzzlehttp/guzzle": "^7.2"改成"^7.5"?install当它不存在 - 你删掉了整个
require-dev区块?install还是照装旧包,只要 lock 里有记录
这种行为不是缺陷,是保障 CI/CD 和生产环境一致性的核心机制。但前提是:你得知道它不响应变更,而不是怀疑自己写错了 JSON。
composer update 才是让 composer.json 生效的唯一路径
只有 composer update(或带包名的变体)才会重新读取 composer.json,重新计算依赖树,下载新包,并重写 composer.lock。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 想装上刚加的新包?运行
composer update monolog/monolog(只更新单个)或composer update(全量) - 只改了
description或autoload映射?用composer update --lock,它只刷新 lock 文件顶部的content-hash,不动任何包版本 - 误删了
composer.lock?别慌,composer install会自动退化为update行为——但这属于意外,不是推荐流程
注意:composer require --no-update 虽然会改 composer.json,但它不触发安装,也不更新 lock,后续仍需手动 update 才能让改动落地。
常见报错和警告背后的真实含义
看到 Warning: The lock file is not up to date?说明 composer.json 和 composer.lock 已不一致,但 install 仍会按 lock 执行——它只是提醒你“你改了声明,但没同步实现”。
-
Nothing to install or update不是错误,而是告诉你:vendor 和 lock 完全匹配,无需动作。如果此时 vendor 里确实缺包,问题出在 lock 文件本身没包含它(比如你新增后没 run update) -
Your requirements could not be resolved往往发生在install阶段,但根源是 lock 文件里锁了一个和当前 PHP 版本不兼容的包(比如 lock 记的是 PHP 8.1 专用版本,而你本地是 8.2) -
JSON decode error是手改composer.json时最常踩的坑:多了一个逗号、少了一个引号、用了中文引号——composer validate可能不报,但install会直接失败
如何验证改动是否真正生效
别只信命令输出,直接查文件和目录:
- 运行
ls vendor/monolog/monolog,确认目录存在且非空 - 执行
composer show monolog/monolog,看输出的版本是否和composer.json里写的约束匹配(注意:它显示的是实际安装版本,不是约束表达式) - 检查
composer.lock时间戳是否在你运行update后更新过;再打开 lock 文件,搜索对应包名,确认其version字段已变 - 如果用了
--no-dev,确保require-dev里的包确实没出现在vendor/中,否则可能是 lock 文件没区分 dev/main,或者你漏掉了该参数
最关键的细节:团队协作中,composer.lock 必须提交 Git;只要有人删了它又没告知,其他人 install 就会变成 update,导致环境漂移——这问题往往要等上线后才暴露。










