require-dev 中的包仅通过 --no-dev 参数控制是否安装,部署时必须显式添加该参数,否则开发依赖会进入生产环境;autoload-dev 中的类在 --no-dev 下不会被加载,测试类不可在生产代码中硬引用。

require-dev 字段只管写入,不管安装
执行 composer require --dev phpunit/phpunit 只会把包加进 composer.json 的 require-dev 字段,不会自动让它“只在开发环境生效”。它是否被装、是否能被加载,完全取决于后续命令有没有加 --no-dev。不加这个参数,composer install 就会照单全收——哪怕你是在生产服务器上跑的。
部署时漏掉 --no-dev 是最常踩的坑
很多线上故障就源于这一个参数没加:symfony/debug、barryvdh/laravel-debugbar 这类包被意外装进生产环境,轻则拖慢响应,重则暴露调试接口或引发兼容问题。CI/CD 脚本、Dockerfile、上线部署文档里必须显式写死:
composer install --no-dev --optimize-autoloader-
composer update --no-dev(仅限需要更新时)
别依赖“本地开发用 dev、线上不用”这种模糊认知——Composer 不认环境变量,只认命令行参数。
autoload-dev 里的类在 --no-dev 下不可用
如果某个包在 require-dev 里定义了 autoload-dev(比如把 Tests\ 命名空间映射到 tests/),那么执行 composer install --no-dev 后,这些 autoload 规则根本不会写进 vendor/autoload.php。此时代码里若直接 new \Tests\FooTest(),运行时就会报 Class not found。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
这意味着:
- 测试类不能在生产代码中硬引用
- CI 跑测试必须用完整安装(不加
--no-dev) - 不要指望“装了但不加载”——不装,就不加载
别搞 composer.prod.json 这种多配置文件
有人想拆出两个 composer.json 文件,再靠脚本替换,这是反模式。Composer 不支持动态切换配置文件,强行替换会导致 composer.lock 失效、本地和线上行为不一致,甚至出现“删掉 require-dev 后 CI 跑不过”的诡异问题。
真正该做的只有两件事:
- 把开发工具(PHPUnit、PHPStan、php-cs-fixer)全放
require-dev - 所有部署流程统一加
--no-dev
复杂点在于:你得确保每个部署入口(CI 脚本、运维手册、Docker 构建步骤)都守住了这一条线。漏一处,整个隔离就失效了。










