require 是运行时必需依赖,线上缺失直接崩溃;require-dev 仅用于开发测试,部署必须显式加 --no-dev 否则会混入生产环境,导致体积膨胀、启动变慢或运行时异常。

require 里的包,线上缺了就直接崩;require-dev 里的包,不参与任何请求链路,只在你敲命令时才起作用——部署漏掉 --no-dev,等于白分。
怎么判断一个包该放 require 还是 require-dev?
只看一件事:这个包的类会不会被 PHP 运行时加载?
- 控制器里
new GuzzleHttpClient()→ 必须进require - 测试文件里
use PHPUnitFrameworkTestCase→ 进require-dev -
dump($data)调用的是SymfonyComponentVarDumperVarDumper→ 如果线上 debug 模式开着,就必须进require,否则进require-dev就会报错 -
grep -r "use.*Mockery" .或grep -r "new.*PhpParser" .,只要匹配到业务代码(非 tests/ 目录),就得挪进require
composer require 和 composer require --dev 写错会怎样?
少个空格或连字符写错,后果很实在:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer require-dev phpunit/phpunit→ 命令无效,Composer 报错“Unknown command” -
composer require --dev phpunit/phpunit→ 正确,写入require-dev -
composer require phpunit/phpunit→ 错误,写入require,导致生产镜像白多 20MB+,还可能暴露/vendor/bin/phpunit - CI 脚本里写成
composer require-dev(没空格),实际执行失败但被忽略,后续测试步骤直接报Class not found
Dockerfile 和 CI 里为什么必须显式写 --no-dev?
Composer 不读 APP_ENV,也不看服务器 hostname,它只认参数。没写就是默认全装。
- Dockerfile 中写
RUN composer install→ 线上镜像含 PHPUnit、PHPStan、Faker,体积大、启动慢、有 CVE 风险 - 正确写法:
RUN composer install --no-dev --optimize-autoloader - GitHub Actions 缓存 key 必须包含标志,比如:
composer-${{ hashFiles('**/composer.lock') }}-${{ env.COMPOSER_FLAGS || '--no-dev' }},否则缓存复用导致 dev 包漏装或误装 - CI 测试阶段要跑
composer install && ./vendor/bin/phpunit,但构建 prod 镜像那步必须切回--no-dev
autoload-dev 是给谁用的?
不是给 phpunit/phpunit 自己用的,而是给你自己的测试类用的。
-
autoload-dev的作用:当require-dev包已安装(即本地跑过完整composer install)时,把tests/、stubs/这些目录加进自动加载规则 - 即使
autoload-dev配了"psr-4": {"Tests\": "tests/"},如果生产环境只跑--no-dev,tests/根本不会被加载 - 如果你的
tests/Feature/AuthTest.php用了MockeryMockInterface,除了把mockery/mockery放require-dev,还得确保autoload-dev包含tests/路径,否则 CI 仍报Class not found
最常被忽略的点:autoload-dev 配得再全,也救不了没装的 require-dev 包;而 --no-dev 漏写一次,整个生产环境就混进了开发工具链。这不是配置问题,是部署契约。










