require 是运行时必需依赖,require-dev 仅用于开发测试;安装行为由 --no-dev 参数控制,生产环境必须用 composer install --no-dev;放错位置会导致线上故障,添加依赖须用对应命令区分用途。

require 是项目运行时必需的依赖,比如框架、数据库组件、日志库;require-dev 是仅在开发、测试、构建阶段用到的工具型依赖,比如 PHPUnit、PHPStan、PHP-CS-Fixer。
安装行为由命令决定,不是由环境自动切换
Composer 不识别 APP_ENV 或服务器类型。它只看安装命令是否带 --no-dev:
-
composer install(默认)→ 同时安装require和require-dev -
composer install --no-dev→ 只装require中的包,生产部署必须加这一句 -
composer update(默认)→ 更新全部依赖;加--no-dev才只更新require
放错位置会直接导致线上故障
把该进 require-dev 的包写进 require,或反过来,都会出问题:
- phpunit 放在
require→ 生产环境 autoloader 尝试加载测试类,报Class not found - monolog 放在
require-dev→ 线上启动失败,因为日志功能根本不可用 - laravel-debugbar 进
require→ 调试面板可能在生产暴露敏感信息,有安全风险
添加依赖时务必用对命令
区分用途要从第一步就做对:
立即学习“PHP免费学习笔记(深入)”;
- 加测试工具:用
composer require --dev phpunit/phpunit:^10 - 加运行时组件:用
composer require monolog/monolog:^3 - 误加了?删掉
composer.json中require下对应行,再执行composer update 包名
autoload-dev 不是运行时开关,只影响自动加载生成
autoload-dev 配置只在 composer dump-autoload 时参与生成规则。一旦用了 --no-dev,这些路径就不会被写入 production autoloader:
- 测试命名空间(如
Tests\)只在autoload-dev中声明 → 不装 dev 包,就无法 new 测试类 - 不能靠
class_exists('SomeTest')判断存在性,它会触发 autoload 失败;改用interface_exists()或环境守卫 -
vendor/autoload.php是统一入口,不会根据是否装了 dev 包动态调整逻辑



















