必须用composer require --dev添加仅开发用的包(如phpunit、mockery),否则误入require会导致线上Class not found或镜像膨胀;部署时务必配合composer install --no-dev,且需确保composer.lock不含dev依赖。

只有当你装的包在生产环境完全不参与运行时,才该用 composer require --dev。 否则它会进 require 字段,上线后要么白装、要么报错——这不是 Composer 的 bug,是你没分清依赖角色。
哪些包必须加 --dev 才安全
这类包只在本地写代码、跑测试、查问题时起作用,线上一启动就该“消失”:
-
phpunit/phpunit:单元测试框架,生产环境不需要执行测试 -
mockery/mockery:写 Mock 对象专用,运行时根本不会加载 -
barryvdh/laravel-debugbar:开发期调试栏,线上开着等于暴露内部结构 -
php-cs-fixer或laravel/pint:代码格式化工具,部署时不需要解析 PHP 语法 -
sebastian/object-enumerator:对象图分析工具,仅用于测试或内存诊断
误把它们装进 require,会导致线上 Class not found(比如用了 dump() 却没装 symfony/var-dumper),或者更糟:CI 脚本里漏了 --no-dev,结果把 phpunit 打进 Docker 镜像,白白增大体积还带潜在风险。
为什么 --dev 不等于“自动隔离”
--dev 只改 composer.json 的 require-dev 字段,并立即安装。但它本身不控制部署行为——真正决定是否装上这些包的,是后续的 composer install 是否带 --no-dev:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 本地运行
composer install(无参数)→ 默认装require-dev全部包 - 线上运行
composer install --no-dev→ 完全跳过require-dev,连 autoload 映射都不生成 - 如果
composer.lock是别人用--no-dev生成并提交的,你本地跑composer install也不会装 dev 包(lock 文件已锁定无 dev 的依赖树)
所以光加 --dev 没用,关键看 CI/CD 流水线里那行 composer install 命令有没有 --no-dev,以及 composer.lock 是否干净。
怎么验证 --no-dev 真生效了
别只信命令行输出,得看实际结果:
- 运行
composer show --dev,输出No dependencies installed for development才算成功 - 手动
ls vendor/,确认phpunit、php-cs-fixer这类目录不存在 - 检查
vendor/composer/autoload_dev.php是否为空或未生成(--no-dev下这个文件通常不生成) - 如果用了
config.autoload-dev,注意它只在require-dev包存在时才生效;--no-dev后这部分 autoload 规则直接被忽略
最容易被忽略的是 composer.lock 文件本身:如果它里面记录了 dev 包的哈希和版本,哪怕你加了 --no-dev,Composer 仍会校验这些信息——所以 CI 中应先用 composer update --no-dev --lock 生成干净 lock,再提交。

















