composer require --dev 写错会导致phpunit等开发依赖被误装入生产依赖,部署时须强制使用--no-dev,且代码中调用dev包需条件判断,autoload-dev仅控制项目测试目录加载而非第三方工具。

composer require --dev 写错就进 require 了
命令里少个空格、多条横线,composer require --dev phpunit/phpunit 就可能变成 composer require-dev phpunit/phpunit——后者根本不是合法子命令,Composer 会把它当成 composer require dev,把字符串 dev 当作包名塞进 require 字段。结果就是 PHPUnit 被写死在生产依赖里,上线后必报 Class 'PHPUnit\Framework\TestCase' not found。
常见误操作包括:
-
composer require-dev phpunit/phpunit(无效命令,实际装进require) -
composer require phpunit/phpunit(没加--dev,默认进require) - 手动编辑
composer.json时把phpunit拖到require下,还顺手删了require-dev块
验证方式:执行 composer show | grep phpunit,如果输出里带 required by your project,说明它已在 require 中,得立刻删掉那行再跑 composer update phpunit/phpunit。
部署不加 --no-dev = 白装
Composer 不看 APP_ENV=prod,也不读服务器 hostname,它只认命令参数。没加 --no-dev,require-dev 里的包照装不误——线上多出 PHPUnit、PHPStan、Faker,体积膨胀、启动变慢、还可能暴露调试接口。
必须在所有生产部署路径中显式带上:
- Dockerfile 里写死:
composer install --no-dev --optimize-autoloader - GitHub Actions / GitLab CI 的缓存 key 必须包含
--no-dev,例如:composer-${{ hashFiles('**/composer.lock') }}-${{ env.COMPOSER_FLAGS || '--no-dev' }} - CI 测试阶段用完整安装(
composer install && ./vendor/bin/phpunit),但构建镜像那步必须切回--no-dev
漏掉这句是高频翻车点,不是“建议”,是硬性前提。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
代码里调用 dev 包 = --no-dev 也救不了
--no-dev 只控制安装,不拦运行时调用。只要代码里执行到相关语句,autoload 就会触发并失败。
典型泄漏场景:
- 在
config/app.php里写了class_exists('PhpCsFixer\Fixer\LineEnding\LineEndingFixer')—— 这个函数会触发 autoload,而类根本不存在 - 控制器里留着临时
dump($data),但symfony/var-dumper在require-dev里 - 测试专用的
Mockery\MockInterface被漏写进autoload-dev,CI 报错找不到类
安全做法:
- 用
interface_exists()或function_exists()替代class_exists()(它们不触发 autoload) - 把所有 dev 工具逻辑包裹在
if (app()->environment('local')) { }或if (PHP_SAPI === 'cli') { }中 - 别在全局配置文件里做条件加载,容易漏判
autoload-dev 不是给 PHPUnit 用的
这个名字极具误导性。autoload-dev 的作用不是让 phpunit/phpunit 自己能加载,而是告诉 Composer:“当本项目启用了 dev 模式(即装了 require-dev 包)时,请额外把我的测试目录(如 tests/)也加进自动加载规则”。它和 require-dev 包本身无关。
所以:
- 漏配
autoload-dev,会导致phpunit命令能跑,但你的tests/ExampleTest.php里的类找不到 - 即使
autoload-dev配得再全,如果没装require-dev包(比如生产环境只跑--no-dev),这些路径也不会生效 - 执行
composer dump-autoload --classmap-authoritative时,autoload-dev默认不生效,得加--dev参数才处理测试路径
真正容易被忽略的是:autoload-dev 是你自己的测试代码的加载开关,不是第三方 dev 工具的加载开关——这个边界一旦混淆,排查方向就全错了。










