dump-autoload 不重装包,只刷新自动加载映射;它仅根据现有 composer.json autoload 配置和 vendor/composer/autoload_*.php 重建 vendor/autoload.php,若新类未在 autoload 中声明规则(如 psr-4),则无效。

dump-autoload 不会重装包,只刷新自动加载映射
很多人执行 composer dump-autoload 是想“让新写的类被识别”,结果发现还是报 Class not found。根本原因在于:这个命令**不修改 vendor 目录、不重下载任何包、也不解析 composer.json 的 require 变更**——它只根据当前 vendor/composer/autoload_*.php 和 composer.json 里的 autoload 配置,重新生成 vendor/autoload.php 及其底层映射文件。
所以如果你刚加了一个新 class 文件但没在 composer.json 中声明对应 autoload 规则(比如没加 "psr-4": {"App\": "src/"} ),dump-autoload 做再多也没用。
什么时候必须加 --optimize 或 --classmap-authoritative
默认情况下,Composer 的 autoloader 会按顺序尝试 PSR-4 / PSR-0 / classmap / files 四种方式加载,遇到不存在的类还会继续往下找——这带来轻微性能开销,尤其在 CLI 环境或高频请求中。
-
composer dump-autoload --optimize:把所有类路径提前扫一遍,生成一个完整classmap数组,跳过动态查找逻辑;适合生产环境部署后固化一次 -
composer dump-autoload --classmap-authoritative:告诉 autoloader “classmap 就是全部”,遇到未命中直接抛错,不再 fallback 到 PSR-4 查找;能避免因命名空间写错却静默失败的问题 - 二者可同时使用,但注意:
--classmap-authoritative要求所有类都已被 classmap 收录(即得配合--optimize或确保autoload.classmap已配全)
开发中改了 composer.json autoload 后必须 reload
比如你新增了一段:
"autoload": {
"psr-4": {
"MyLib\": "lib/"
}
}
这时不能只改 JSON 就完事。必须运行:
composer dump-autoload ——否则 vendor/autoload.php 仍不知道 MyLib\ 对应哪条路径
如果还涉及已安装包的 autoload 配置变更(比如某个包升级后改了它的 autoload 字段),需要先 composer update vendor/package-name 拉取新版 composer.lock,再 dump-autoload。
强制重建 autoload 的真正方法:删 vendor/autoload.php 再 dump
极少数情况下(如 Composer 升级后缓存异常、或多版本共存导致 autoload.php 被意外覆盖),单纯 dump-autoload 无法生效。此时可手动清理:
- 删除
vendor/autoload.php - 删除
vendor/composer/autoload_*.php(尤其是autoload_classmap.php、autoload_psr4.php) - 再执行
composer dump-autoload
注意:不要删整个 vendor/ 目录——那等于重装,和 autoload 无关;也不要删 composer.lock,否则下次 install/update 行为不可控。
autoload 机制本身不复杂,但容易和依赖安装、命名空间配置、PSR 标准理解混在一起。最常被忽略的是:你写的类到底有没有被任何一条 autoload 规则覆盖到——而不是 dump 这个动作本身够不够“强制”。










