composer install --no-dev是唯一可靠方式,它从源头跳过require-dev包的解析、下载、安装及autoload-dev注册,而非事后过滤;漏用会导致phpunit等dev包误入生产环境,引发安全与运行时风险。

composer install --no-dev 是唯一可靠方式,它不装 require-dev 里的任何包,也不注册 autoload-dev 规则——不是“过滤已安装的”,而是从源头跳过解析、下载和写入。
为什么 --no-dev 是必须加的参数,而不是可选优化?
Composer 不识别“生产环境”概念,composer install 默认会把 require 和 require-dev 全部装上。漏掉 --no-dev 的典型表现包括:vendor/bin/phpunit 出现在线上镜像里、symfony/var-dumper 占用额外 5MB、部署后报 Class 'PHPUnit\Framework\TestCase' not found(说明代码误引用了未安装的 dev 类)。
这不是性能问题,是语义问题:--no-dev 告诉 Composer “别看 require-dev 字段”,而 --optimize-autoloader 或 --no-interaction 都不改变依赖范围。
加了 --no-dev 还有 dev 包?检查 composer.lock 是否干净
--no-dev 只在 composer.lock 文件本身不含 dev 包时才真正生效。如果 lock 文件是上次用 composer update(没加 --no-dev)生成的,里面仍存着 phpunit/phpunit 的版本记录,install --no-dev 就会照单全收。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行
grep -A 5 "require-dev" composer.lock,输出为空才表示 clean - CI/CD 中首次部署前,应在干净环境中执行
composer update --no-dev --lock,再提交新 lock 文件 - 不要在生产机上跑
composer update,哪怕加了--no-dev—— 它会改 lock,破坏可复现性
tests/ 目录还在?--no-dev 不负责删文件
--no-dev 只影响 require-dev 声明的包,不会删除项目根目录下的 tests/、phpunit.xml 或 vendor 里第三方库自带的测试目录。
真正排除这些文件的方式只有三种:
- 源头控制:在项目根目录加
.gitattributes,写入/tests export-ignore - 归档配置:在
composer.json根级加"archive": {"exclude": ["/tests"]}(仅对composer archive或 Packagist 构建 dist 包有效) - 安装后清理:用
post-install-cmd脚本执行rm -rf vendor/somevendor/somelib/tests,但要注意这会破坏 vendor 完整性,且下次update可能恢复
最容易被忽略的是 lock 文件状态和 autoload-dev 的残留映射——即使没装 dev 包,如果 composer dump-autoload 没加 --no-dev,生成的 vendor/autoload.php 里仍可能包含测试路径,导致运行时报错。










