composer install --no-dev 有时无效,根本原因是 composer.lock 文件已记录 packages-dev 条目,该参数仅跳过安装动作而不修改 lock 结构;需配合清理 vendor、重生成纯净 lock 文件及执行 composer dump-autoload --no-dev 确保 autoload 映射同步。

直接加 --no-dev 参数即可跳过安装 require-dev 中的包,但要注意它不清理 autoload-dev 映射、不删除已存在的 vendor/ 下 dev 包、也不影响 lock 文件内容。
为什么 composer install --no-dev 有时没效果
根本不是参数失效,而是 composer.lock 文件里已经存了 "packages-dev" 条目。只要 lock 文件里有 "phpunit/phpunit" 或 "larastan/larastan" 这类记录,composer install --no-dev 就会照装——它只跳过“安装动作”,不改 lock 结构。
- 验证方式:
grep -A5 '"packages-dev"' composer.lock | head -20,输出非空说明 lock 已污染 - 常见翻车点:本地执行过
composer update(没加--no-dev),CI 脚本先跑无参install再补--no-dev,Docker 构建复用旧vendor/缓存 - 修复方法:删掉
composer.lock+rm -rf vendor/+composer install --no-dev
--no-dev 不等于禁用 autoload-dev
--no-dev 只控制是否把 require-dev 的包复制进 vendor/,但只要 composer.json 里还写着 "autoload-dev": { "psr-4": { "Tests\": "tests/" } },运行 composer dump-autoload 就会把 Tests\ 映射写进 vendor/autoload.php。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 后果:生产环境
class_exists('PHPUnit\Framework\TestCase')返回true,但new \PHPUnit\Framework\TestCase()直接报错——因为vendor/phpunit/phpunit根本不存在 - 安全做法:部署后必须补一句
composer dump-autoload --no-dev,或干脆删掉autoload-dev块(如果测试类不参与自动加载) - 别依赖
COMPOSER_NO_DEV=1:该环境变量在 Composer 2.9.6+ 已被弃用,行为不可靠
生产环境推荐的一行命令
Dockerfile 或 CI 脚本中,应固化以下写法:
composer install --no-dev --optimize-autoloader --no-scripts
-
--no-dev:跳过require-dev所有包,vendor/下不会出现phpunit/、mockery/等目录 -
--optimize-autoloader:生成 classmap,避免运行时 PSR-4 查找开销(对 Laravel/Symfony 类多的项目尤其明显) -
--no-scripts:防止执行post-install-cmd里的测试、lint 或缓存清除命令——这些在构建镜像阶段毫无意义,还可能因缺扩展失败
真正麻烦的不是装不上,而是装上了却崩在运行时;--no-dev 只解决“装什么”,不解决“怎么加载”和“有没有扩展”。漏掉 dump-autoload --no-dev 或忽略 config.platform 设置,线上照样 Class not found。










