必须用 composer require --dev,否则包会进 require 字段,上线时若漏掉 --no-dev 将导致 phpunit 等被装入生产环境,引发 class not found 错误、安全风险及镜像膨胀。

必须用 composer require --dev,否则包会进 require,上线时可能报 Class not found 或引入安全风险。
为什么 composer require --dev 不能省略 --dev
不加 --dev,Composer 默认把包写入 require 字段——哪怕你只打算本地跑测试。一旦 CI/CD 流水线或运维脚本漏了 --no-dev,这个包就会被装进生产环境的 vendor/,后果包括:
-
phpunit/phpunit进了线上autoload.php,导致Cannot declare class PHPUnitTextUIResultPrinter -
symfony/var-dumper被AppServiceProvider里的dump()调用,但生产没装 →Fatal error: Class "SymfonyComponentVarDumperVarDumper" not found - 镜像体积翻倍(
phpstan单独占 40MB+),CI 扫描报高危 CVE
composer install --no-dev 是生效前提,不是可选项
--dev 只控制写入哪个字段,真正跳过安装靠的是部署时加 --no-dev。它不只是“不装”,而是:
- 完全跳过解析
require-dev下所有包及其依赖树 - 不生成
vendor/autoload_dev.php - 不执行
autoload-dev配置里的路径映射
验证是否生效?在生产环境执行:
composer install --no-dev ls vendor/ | grep phpunit
输出应为空。如果还有,要么命令没加 --no-dev,要么有人手动把包挪进了 require。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
autoload-dev 和 require-dev 是两回事
把包放进 require-dev 不等于它的类能被自动加载。比如你写了自定义测试基类 MyTestCase 放在 tests/Support/,仅靠 composer require --dev myorg/test-helpers 不够,还得确认 composer.json 里有:
"autoload-dev": {
"psr-4": {
"Tests\": "tests/"
}
}
否则即使包装上了,new TestsMyTestCase() 仍会报 Class not found。常见疏漏是只改了 require-dev,忘了同步维护 autoload-dev。
升级、重装、CI 流水线里的坑
composer require --dev foo/bar 对已存在包无效——它不升级,只声明。要更新版本,得用:
-
composer require --dev foo/bar:^2.0(覆盖写入并重装) -
composer update --no-dev foo/bar(跳过其他 dev 包,只更新这个)
CI 流水线里容易错的地方:
- 测试阶段:必须用
composer install(不加--no-dev),否则 PHPUnit 没法跑 - 构建生产镜像阶段:必须用
composer install --no-dev,且建议在多阶段 Dockerfile 的 final 阶段重新执行,避免继承 build 阶段的完整vendor/ - 缓存策略:不要缓存
vendor/全量目录,而应缓存composer.lock+ 分开缓存 dev/non-dev 安装结果
最常被忽略的一点:require-dev 的边界失效,往往不是因为命令写错,而是部署流程没对齐、autoload 配置没跟上、或者 CI 脚本硬编码了 composer install。










