--no-dev是生产环境唯一生效方式,它强制跳过require-dev包的解析、下载、安装及autoload注册;若composer.lock含dev记录则报错中断,必须配合干净lock文件与composer dump-autoload --no-dev验证autoload映射。

composer install --no-dev 是唯一生效方式
生产环境执行 Composer 时,--no-dev 是唯一能真正屏蔽 require-dev 包的参数。它不是“建议”,而是硬性开关:Composer 遇到这个参数会直接跳过 require-dev 字段的全部解析、下载、安装和 autoload 注册流程。
常见误操作包括:
- 只删掉
composer.json里的require-dev块——composer.lock中仍存旧记录,install会照装 - 设
COMPOSER_NO_DEV=1环境变量——Composer 2.2+ 已弃用该变量,行为不可靠,CI 脚本中极易被覆盖 - 先跑一次没带
--no-dev的install,再补加参数——已装的phpunit/phpunit不会自动卸载
为什么 --no-dev 必须搭配干净的 composer.lock
--no-dev 的执行效果高度依赖 composer.lock 文件是否“干净”。如果 lock 文件里已有 packages-dev 区块或 packages 数组中包含 dev 包(如 "phpunit/phpunit"),Composer 会报错:"dev dependencies not found",安装中断。
上线前必须确保 lock 文件不含 dev 包:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在无
vendor/、无缓存的干净环境中运行composer install --no-dev,再提交生成的composer.lock - 打开
composer.lock搜索"packages": [,确认里面没有phpunit、mockery、symfony/debug-bundle等包名 - 不要复用本地开发生成的 lock 文件,尤其当本地曾执行过
composer update且未加--no-dev
部署后必须验证,不能只信命令输出
命令行显示 Installing dependencies from lock file 并不等于成功。物理目录和 autoload 映射才是真实依据:
- 进服务器或容器执行:
ls vendor/ | grep -E "phpunit|mockery|symfony/debug",输出应为空 - 运行:
composer show --dev,应提示"No dependencies installed for development"或直接报错"Command 'show' is not defined" - 检查
vendor/composer/autoload_static.php,搜索tests/或Tests/路径映射——哪怕vendor/phpunit目录不存在,只要 autoload 里还留着路径,某些框架仍可能触发静默异常
autoload-dev 的残留比包本身更危险
最隐蔽的风险不在包有没有装,而在于 autoload-dev 规则是否被写入最终 autoloader。即使你删了 vendor/,只要 composer.json 里还保留 "autoload-dev": {"psr-4": {"Tests\": "tests/"}},下次 dump-autoload 就会重新加载进去。
正确做法是:
- 生产构建中显式执行:
composer dump-autoload --no-dev,它会跳过autoload-dev块的合并 - 若项目无需测试类自动加载,直接从
composer.json中移除整个autoload-dev字段 - 注意:Laravel 的
phpunit.xml可能依赖该配置,删前需同步检查
这一步多花 10 秒验证,能避免半夜排查 autoload 映射导致的 Class not found 或静默失败。










