--dev 依赖是仅用于开发、测试、构建阶段的包,写入 composer.json 的 require-dev 字段,如 PHPUnit、PHPStan;生产部署应使用 composer install --no-dev 跳过它们,避免体积增大、安全风险和性能影响。

Composer 的 --dev 选项用于明确声明某个包是仅在开发阶段需要的依赖,不会被部署到生产环境。
什么是 --dev 依赖?
使用 composer require package-name --dev 安装的包,会被写入 composer.json 的 require-dev 字段,而非 require 字段。这类包通常包括测试工具(如 PHPUnit)、代码检查器(如 PHPStan、PHP_CodeSniffer)、本地开发服务器(如 Laravel Sail)、或调试辅助工具(如 laravel/tinker)。
它们对应用运行本身没有影响,只在开发、测试、构建阶段起作用。
安装时是否启用 --dev 会影响什么?
默认情况下,composer install 或 composer update 会同时安装 require 和 require-dev 中的包。但你可以通过加参数控制:
-
composer install --no-dev:跳过require-dev中的所有包,只装生产依赖 —— 这是上线部署的标准做法 -
composer install(不带参数):安装全部依赖,适合本地开发 -
composer update --no-dev:更新时忽略开发依赖,防止误升级测试相关工具
如何验证一个包是不是 dev 依赖?
打开项目根目录下的 composer.json,查看两个字段:
-
"require":列在这里的包是运行必需的,比如"monolog/monolog"、"guzzlehttp/guzzle" -
"require-dev":列在这里的是开发专用,比如"phpunit/phpunit"、"fakerphp/faker"
执行 composer show --dev 可以只列出当前已安装的开发依赖;而 composer show 显示全部。
不加 --dev 会有什么风险?
如果把本该是开发用的包(比如测试框架)误装进 require,会导致:
- 生产环境多出不必要的文件和类,增大部署体积
- 可能引入安全风险(例如开发工具自带 Web 界面或调试端点)
- 自动加载器加载更多无关类,轻微影响性能
- CI/CD 流程中若未加
--no-dev,可能因开发依赖冲突导致构建失败










