require-dev 中的包运行时不会被加载,前提是生产部署必须执行 composer install --no-dev 跳过安装,否则可能因体积膨胀、autoload 冲突或 class not found 导致故障。

require-dev 里放的包,运行时不会被加载
Composer 用 require-dev 字段明确区分开发/测试阶段才需要的包,比如 phpunit/phpunit、phpstan/phpstan、laravel/pint。这些包只参与本地开发、测试、代码检查,不参与线上运行逻辑。一旦写进 require,就会被 composer install 装到 vendor/ 并可能被自动加载器注册——哪怕你线上根本不用它。
- CI/CD 构建或线上部署时,必须加
--no-dev:composer install --no-dev会跳过require-dev下所有条目,减少体积、缩短安装时间、降低攻击面 - 本地执行
composer install默认会装require-dev,但线上脚本漏掉--no-dev是高频事故点,轻则多占几十 MB 空间,重则因 dev 包触发 autoloader 冲突导致Class not found -
roave/security-advisories这类纯冲突拦截工具,必须放require-dev——它本身不提供任何可调用类,只在composer update时起作用
dev 包也能被 require,但得靠配置控制
有些包在开发和生产环境行为不同(比如日志驱动、缓存适配器),不能靠 require / require-dev 拆分来切换,否则容易误判依赖边界。正确做法是统一放 require,再通过项目配置或环境变量控制启用逻辑。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 例如
symfony/var-dumper:本地调试时需要,线上应禁用;但它本身是运行时可选组件,不是“仅开发用”,所以更适合放在require,再用APP_DEBUG=false控制是否加载 - 错把
doctrine/dbal放进require-dev会导致迁移命令在生产环境直接报错——它是运行时必需的,只是开发时更频繁使用 - 某些框架(如 Laravel)的调试工具包(
barryvdh/laravel-debugbar)虽属 dev 场景,但因需注册服务提供者,也建议放require并配合条件加载
composer install --no-dev 不等于完全隔离 dev 环境
加了 --no-dev 只跳过安装,不阻止代码里硬引用 dev 包。如果某处写了 use PHPUnitFrameworkTestCase; 却没做环境判断,线上即使没装 phpunit,也会在解析阶段就 fatal error。
- 检查
vendor/autoload.php是否包含files类型自动加载:有些 dev 包(如php-cs-fixer)会注册全局函数,删包后残留调用会直接崩 - 运行
composer show --dev查看当前已安装的 dev 包列表,确认是否符合预期 - CI 流水线中建议加一步
grep -r "PHPUnit\|phpstan\|psalm" app/ --include="*.php" || true,快速扫描是否有未加保护的 dev 包引用
require-dev 是声明意图,不是运行时防火墙。真正隔离靠的是安装策略 + 代码条件 + 自动加载清理三者配合。漏掉任一环,都可能让测试包悄悄混进生产环境。










