--no-dev是生产部署唯一可靠方式,它强制跳过require-dev包的解析与安装,避免dev依赖污染生产环境;需配合干净的composer.lock和vendor目录,并验证autoload映射是否残留。

必须用 composer install --no-dev,其他方式都不算真正生效。 它不是可选项,而是生产部署的硬性前置条件;漏掉这个参数,等于把本地开发环境直接搬上服务器。
为什么--no-dev是唯一可靠方式
这个参数直接告诉 Composer:跳过 require-dev 区块里的所有包,不解析、不下载、不写入 vendor/。它不依赖环境变量、不靠缓存清理、也不看配置文件是否“看起来干净”。
-
COMPOSER_NO_DEV=1在 Composer 2.2+ 中已被弃用,行为不稳定,CI 脚本里设了也可能被覆盖 - 只删
composer.json里的require-dev没用——composer.lock里还存着旧记录,install会照装 - 先跑一次没带
--no-dev的install,再补加参数也没用——已装的phpunit不会自动卸载
composer.lock 必须“干净”才真正起效
--no-dev 只在 composer.lock 本身不含 dev 包时才顺利执行;如果 lock 文件里已有 phpunit/phpunit 的 dist 条目,install --no-dev 会报错:"dev dependencies not found"。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 首次上线前,应在干净环境(无
vendor/、无composer.lock)运行:composer update --no-dev --lock,再提交 lock 文件 - CI 脚本中建议加一步:
git clean -xffd vendor/ && rm -f composer.lock,避免复用污染过的缓存 - 检查 lock 文件是否干净:打开后搜
"packages": [,再确认里面没有phpunit、phpstan、symfony/debug-bundle等包名
部署后必须验证,不能只信命令行输出
命令跑完不代表成功——得进服务器或容器里看真实结果。常见误判是看到 vendor/autoload.php 还在,就以为一切正常。
- 执行:
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或autoload_classmap.php,确认里面没有来自tests/或Tests/的路径映射(否则说明autoload-dev规则仍被加载) - 别忘了清理
vendor/里残留的危险内容:rm -rf vendor/bin/ vendor/**/tests/ vendor/**/Tests/ vendor/**/t
最隐蔽的风险不在包有没有装,而在于 autoload 映射是否残留——哪怕物理目录被删了,只要类路径还留在 autoload_static.php 里,某些框架或工具仍可能触发加载失败或静默异常。验证这一步,永远比写脚本多花 10 秒,但能省下半夜排查的两小时。










