require用于声明项目运行必需的依赖,如框架、数据库组件和第三方SDK,这些包会随项目部署到生产环境;2. require-dev用于声明仅在开发和测试阶段需要的工具,如PHPUnit、PHPStan、Faker等,不会默认部署到生产环境;3. 安装时composer install根据环境决定是否安装require-dev中的包,两者均记录在composer.lock中并被自动加载,但用途不同;4. 正确区分二者可保持生产环境简洁安全,提升部署效率。

在使用 Composer 管理 PHP 项目依赖时,经常会看到 require 和 require-dev 这两个配置项。它们虽然都用于声明项目所依赖的包,但用途和作用范围有明显区别。
require:项目运行所必需的依赖
放在 require 中的包是项目上线运行时必须存在的。这些依赖会随项目一起部署到生产环境,缺少它们会导致程序无法正常工作。
例如:
执行命令添加 require 依赖:
composer require monolog/monologrequire-dev:仅开发和测试阶段使用的工具
放在 require-dev 中的包只在开发或测试过程中需要,不会影响线上功能。这类工具通常用于代码质量检查、自动化测试、调试等。
常见 require-dev 类型的包包括:
- PHPUnit(单元测试)
- PHPStan / Psalm(静态分析)
- Faker(测试数据生成)
- PHP_CodeSniffer(代码规范检查)
安装 dev 依赖的命令:
composer require --dev phpunit/phpunit关键区别总结
- 部署影响:require 的包会部署到生产环境;require-dev 的包默认不会(除非显式安装)
-
安装行为:运行
composer install时,若环境不是开发模式(如设置了 COMPOSER_ENV=prod),require-dev 的包可能被跳过 - 锁文件记录:两者都会写入 composer.lock,但安装时可根据参数决定是否安装 dev 部分
- 自动加载:require 和 require-dev 的类库都会被加入自动加载机制,但前者面向应用逻辑,后者多用于脚本调用
实际应用场景举例
假设你正在开发一个 API 服务:
- 使用 Guzzle 发起 HTTP 请求 → 放入 require
- 用 PHPUnit 写测试用例 → 放入 require-dev
- 项目上线后,服务器不需要跑测试,因此无需安装 PHPUnit
基本上就这些。合理区分 require 与 require-dev,有助于保持生产环境简洁、安全,同时提升部署效率。










