必须用 composer install --no-dev,它是生产部署硬性前置条件;该参数直接跳过 require-dev 包的解析、下载与安装,不依赖环境变量或配置,仅当 composer.lock 无 dev 记录时才真正生效,否则报错。

必须用 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、mockery、symfony/debug-bundle等包名
部署后必须验证,不能只信命令行输出
命令跑完不代表成功——得进服务器或容器里看真实结果。常见误判是看到 vendor/autoload.php 还在,就以为一切正常。
- Dify AI 执行:
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/里残留的危险内容:vendor/bin/phpunit、vendor/symfony/console/Tests/、vendor/doctrine/orm/.git——--no-dev只控制“装不装包”,不清理这些
最常被忽略的是:即使 --no-dev 成功执行,autoload-dev 的路径注册仍可能留在 vendor/autoload.php 里;只要某处代码写了 class_exists('Tests\FooTest'),PHP 就可能返回 true,而类其实根本不存在——这种静默行为比报错更难排查。










