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 写错会怎样?
少个空格或连字符写错,后果很实在:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
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 漏写一次,整个生产环境就混进了开发工具链。这不是配置问题,是部署契约。

















