直接改 composer.json 不生效,因 composer.lock 才是安装依据;需运行 composer update 更新锁文件和 vendor,或用 composer require/remove 自动同步三处。

直接改 composer.json 是可行的,但 Composer 不会自动同步到锁文件和 vendor 目录——你改完不运行命令,等于没改。
为什么改了 composer.json 没生效
很多人手动增删 require 里的包、调整版本号后发现 vendor/ 没变,或者 composer install 报错。根本原因是:composer.lock 文件才是安装依据,它不会因为你改了 composer.json 就自动重生成。
-
composer install只读composer.lock,忽略composer.json的变更 -
composer update才会根据composer.json重新解析依赖、更新composer.lock和vendor/ - 如果只加了一个包但没运行
composer update xxx或composer update,那个包根本不会下载
什么时候该用 composer require 而不是手改 JSON
新增依赖时,优先走命令行——它能自动完成三件事:改 composer.json、更新 composer.lock、装进 vendor/。手改容易漏掉其中一环,尤其在团队协作中容易引发锁文件不一致。
- 加包:
composer require monolog/monolog:^2.0(自动写入require并更新) - 删包:
composer remove monolog/monolog(比手动删 JSON + 手动删 lock 更安全) - 升版本:
composer require monolog/monolog:^3.0(自动处理冲突提示,比手改后update更可控) - 仅开发依赖:
composer require --dev phpunit/phpunit(自动写进require-dev)
必须手改 composer.json 的几种情况
命令行做不到的事,才需要打开 JSON 编辑——比如改仓库源、加脚本、调平台配置、切 minimum-stability,或者批量替换一堆包的版本约束。
- 换镜像源:
"repositories": [{"type": "composer", "url": "https://packagist.phpcomposer.com"}]—— 这个没法用require命令加 - 加自定义 autoload:
"autoload": {"psr-4": {"App\": "src/"}}—— 改完要跑composer dump-autoload - 改稳定性:
"minimum-stability": "dev"配合"prefer-stable": true—— 手改后必须composer update才生效 - 删掉某个包但保留 lock 文件里旧记录?不行。手删 JSON 后必须
composer update --lock同步 lock,否则下次install会报错
手改后最容易踩的三个坑
改完 JSON 不等于万事大吉,这三个动作漏一个,轻则 vendor 不更新,重则 CI 失败或本地环境不一致。
- 改完没运行
composer update或composer update xxx→ vendor 和 lock 完全没变 - 改了
autoload没跑composer dump-autoload→ 类找不到,Class not found - 改了
scripts或config项,但没验证是否被识别 → 用composer config --list或composer run-script xxx快速确认
复杂点在于:JSON 里一个字段可能影响多个环节——比如 platform 配置骗过依赖检查,但实际运行时 PHP 版本不够,错误会延迟到 runtime 才暴露。










