直接改 composer.json 不生效,因仅声明未安装;须执行 composer install/update 同步依赖,并运行 composer dump-autoload 更新自动加载,推荐用 composer require 命令替代手改。

直接改 composer.json 不生效?先搞清依赖写法和作用域
手动编辑 composer.json 添加依赖,只是“声明”,不是“安装”。Composer 不会自动拉取或写入 vendor/,必须执行命令同步。常见错误是改完文件就去跑项目,结果报 Class not found —— 因为包根本没下载,autoload 也没更新。
实操建议:
-
"require"下加的包,必须运行composer install(首次)或composer update vendor/package-name(只更新某包)才真正安装 - 如果项目已有
composer.lock,仅改composer.json后运行composer install,会按 lock 文件还原,不会装新声明的包 —— 此时得用composer update或删掉 lock 文件再 install - 开发时推荐用
composer require vendor/package-name命令,它会自动写composer.json+ 执行 install/update,比手改更安全
composer require 的 --dev、--no-update 和版本约束怎么选
命令行添加依赖远比手改灵活,关键是参数别乱配。比如加测试工具却漏了 --dev,结果上线环境也装了 phpunit,白占空间;又或者用了 --no-update 却忘了后续手动 update,依赖始终没落地。
实操建议:
- 运行
composer require friendsofphp/php-cs-fixer --dev:只在 dev 环境安装,require-dev字段自动更新,生产部署时自动跳过 - 加
--no-update仅适合批量修改后统一处理,例如一次改多个包再跑一次composer update,避免反复解析依赖图;日常单个添加不要加 - 版本号别写死,如
composer require monolog/monolog:2.9.0易引发冲突;优先用^2.9(兼容小版本)、~2.9.0(只允许补丁升级),让 Composer 自动选最稳的满足版
修改 composer.json 后 autoload 不生效?检查 autoload 配置和 dump-autoload
新增了本地类库或修改了 "autoload" 部分(比如加了 "psr-4" 映射),但 new MyClass() 还是报错 —— 很可能 autoloader 缓存没刷新,或路径映射写错。
实操建议:
- 改完
"autoload"段后,必须运行composer dump-autoload(可简写为composer du),否则vendor/autoload.php不知道新路径 - 注意
"psr-4"的值是目录路径,不是命名空间前缀;例如"App\": "src/"表示AppFoo对应src/Foo.php,路径必须真实存在且可读 - 如果用的是 classmap,记得加完文件后运行
composer dump-autoload -o(优化模式),否则新文件不会被扫描到
多人协作时手改 composer.json 容易冲突,怎么减少 merge 风险
两个分支各自 composer require 不同包,合并时 composer.json 的 "require" 字段常出现三向合并失败,尤其当格式不一致(换行、缩进、引号)时,Git 无法智能识别语义。
实操建议:
- 团队统一用
composer config --global sort-packages true,让所有require条目自动按字母排序,大幅降低冲突概率 - 禁用 IDE 自动格式化
composer.json的 JSON 引号风格(比如把双引号转单引号),Composer 只认双引号,手改后引号错会导致JSON decode error - CI 流程中加入
composer validate检查,提前发现语法错误,别等 PR 合并后才发现composer.json格式崩了
手改 composer.json 看似快,但漏掉 update、dump-autoload、版本约束或格式细节,反而比命令行多花三倍时间排查。真正省事的方式,是让命令做它该做的事,人只管决定「要什么」和「在哪用」。










