必须加--no-dev,它是生产部署硬性前置条件;该参数从解析阶段绕开require-dev,不下载、不写入vendor、不注册autoload映射,且不依赖环境变量或缓存清理,是唯一可靠方式。

必须加 --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等包名
部署后必须验证,不能只信命令行输出
命令跑完不代表成功——得进服务器或容器里看真实结果。
- 运行
ls vendor/bin:仍可能看到phpunit、phpcs符号链接(它们由其他已安装包声明,不是被“安装”的),但不应有vendor/phpunit/目录 - 运行
composer show --dev应报错或返回空(若在容器内执行需确保 Composer 可用) - 检查
du -sh vendor/* | sort -hr | head -5,确认没有异常大体积的 dev 工具目录
常见误操作和隐性风险
最常被忽略的一点:--no-dev 只控制「安装」,不控制「自动加载规则」。即使没装 phpunit,只要 autoload-dev 还在 composer.json 里,vendor/autoload.php 仍会注册那些路径——只是没对应文件而已。
- 某些框架(如 Laravel)的 Artisan 命令会扫描
vendor/bin,遇到异常脚本可能提前失败 -
vendor/bin里的残留命令不是错误,但有风险:误执行可能因缺少依赖报错,或意外触发本地测试逻辑 - 解决思路不是删文件,而是用
"bin-dir": "bin"配置把 bin 脚本挪到非 Web 可访问路径,并配合部署脚本清理无关 bin










