autoload 用于生产环境且随包发布,包含业务逻辑等正式代码;autoload-dev 仅开发环境使用,不随包发布,专为测试、调试等设计,部署时会被忽略。

autoload 是给生产环境用的,autoload-dev 是给开发环境用的,核心区别在于是否随包一起发布。
autoload 用于可发布的类和代码
这里定义的命名空间或文件路径,会被包含在你发布的 Composer 包中,安装该包的其他项目也能自动加载这些代码。适合放业务逻辑、公共工具类、接口、模型等正式可用的部分。
- PSR-4 映射最常用,比如 "App\\": "src/" 表示 App 命名空间从 src 目录开始解析
- classmap 适合遗留代码或无法按 PSR 规范组织的类文件
- files 适合全局函数文件(如 helpers.php),但要注意它会在每次请求时无条件加载
autoload-dev 仅限本地开发使用
这里面的配置不会被包含在 dist 包里,也不会被 require 进其他项目。专为测试、调试、命令行工具等开发期依赖设计。
- 测试类通常放 tests/ 目录,对应 "Tests\\": "tests/"
- 开发用的命令行脚本、Mock 类、Fixtures 数据等也放在这里
- 如果你用 PHPUnit,它的 bootstrap 文件或测试辅助类就该走 autoload-dev
运行时行为差异要清楚
执行 composer install --no-dev 或部署到生产环境时,autoload-dev 的映射会被完全忽略,生成的 autoloader 文件也不含这部分逻辑。而 autoload 的内容始终生效。
- CI/CD 流水线跑测试时需保留 --dev,否则测试类根本找不到
- 打包 phar 或构建镜像前,确认是否误把 dev 依赖当成了运行依赖
- 用 composer dump-autoload -o 优化自动加载时,--no-dev 会影响最终优化结果
常见误用场景
把单元测试代码写进 autoload,会导致生产环境多加载一堆无用类,影响性能还可能暴露敏感信息;反过来,把核心服务类错放 autoload-dev,会导致其他项目引入你的包后直接报 Class not found。
- 第三方包的测试目录一般不会出现在它的 autoload 里,你可以看 vendor 中任意主流包的 composer.json 验证
- 自己写的 Laravel 或 Symfony 命令类,如果只供本地开发调试,就别放进 autoload
- phpunit.xml 中的 bootstrap 文件路径,要和 autoload-dev 中的 files 或 PSR-4 映射对得上
基本上就这些。区分清楚“谁需要加载”和“什么时候加载”,配置就不会错。










