不应该将测试框架放入require中。运行依赖应与开发依赖分离,PHPUnit等工具必须置于require-dev,避免污染用户环境、引发冲突或增加冗余;主流PHP库均遵循此实践,通过autoload-dev配置测试命名空间,并在CI中正确安装dev依赖;发布时确保不提交vendor目录,使用非dev构建验证兼容性;同时在README中提供贡献指南,明确测试执行方式,如通过composer test运行,保障开发体验与生产纯净性。

开发一个Composer库时,是否在require中引入测试框架(如PHPUnit),是一个常见的设计决策问题。答案很明确:不应该。你的库的require部分应只包含运行时必需的依赖,而测试框架属于开发期工具,应放在require-dev中。
1. 区分运行依赖与开发依赖
require 中的包是你的库运行所必需的。任何使用你库的项目都会自动安装这些依赖。require-dev 则仅用于本地开发、测试、构建等场景,不会被下游项目加载。
测试框架如 PHPUnit 只在你写单元测试时需要,用户的项目运行你的库时完全不需要它。如果把它放在 require 中,会导致:
- 用户项目无端多出不必要的依赖
- 可能引发版本冲突或安全扫描误报
- 增大部署体积,降低安装效率
2. 遵循 Composer 社区最佳实践
所有主流 PHP 库(如 Symfony 组件、Laravel 包)都将 PHPUnit 放在 require-dev 中。这是社区共识,也是 Packagist 和框架文档推荐的方式。
你的 composer.json 应该类似这样:
这样,开发者贡献代码时可以通过 composer install 安装测试工具,而使用者通过 composer require your/library 时不会拉取任何测试相关组件。
3. 正确发布库,避免泄露 dev 依赖
当你发布库到 Packagist,Composer 默认只会读取 require 来确定依赖。但如果你在 CI 或构建流程中操作不当,可能间接影响用户体验。
确保:
- 不将
vendor/提交到版本控制 - CI 测试时运行
composer install --dev - 生产构建或静态分析环境使用非 dev 安装方式验证兼容性
4. 提供清晰的贡献指南
虽然测试框架不在主依赖中,但你仍需让其他开发者能顺利运行测试。在 README 中添加开发说明:
Contributing: Run tests with: composer test Ensure you have installed dev dependencies first.并在 scripts 中定义:
基本上就这些。把测试框架留在 require-dev,是对使用者负责,也是专业库开发的基本素养。简单却关键。










