composer install 会下载测试文件,因其默认拉取整个包(含 tests/ 等非运行必需目录),--no-dev 仅跳过 require-dev 包安装,不删除已安装包内的测试文件;真正排除需依赖上游的 .gitattributes export-ignore 或 composer.json 中 archive.exclude 配置。

为什么 composer install 会下载测试文件?
Composer 默认不会区分生产与开发依赖的源码结构,只要包的 composer.json 中声明了 autoload-dev 或包含 tests/ 目录在 autoload 里,且你没显式禁用开发依赖,vendor/ 下的包就会完整拉取——包括 tests/、phpunit.xml、example/ 等非运行必需文件。
composer install --no-dev 能排除测试文件吗?
不能直接排除。这个参数只跳过安装 require-dev 里的包(比如 phpunit/phpunit),但对已安装的主依赖包内部的测试文件无效——它们是包的一部分,不是“dev 依赖”。
- 即使你加了
--no-dev,vendor/symfony/console/tests/这类路径仍存在 - 真正起作用的是包作者是否在
composer.json中配置了archive.exclude或使用了.gitattributes的export-ignore - 多数主流包(如 Laravel、Symfony)已默认排除测试目录,但小众包或私有包往往没做这步
如何让 Composer 安装时真正跳过测试源码?
靠 composer install 本身做不到,必须依赖包发布方的归档配置。你作为使用者能做的只有两件事:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 确认你要装的包在 Packagist 上的
composer.json是否含"archive": {"exclude": ["/tests/", "/Tests/", "/test/", "/Test/"]} - 若包没配,且你有权限,可在其仓库根目录加
.gitattributes文件,写入:* export-ignore<br>/tests/ export-ignore<br>/Tests/ export-ignore<br>/phpunit.xml export-ignore
- 若包是你自己维护的,发布前务必执行
git archive验证归档内容,或用composer archive测试打包效果
注意:composer create-project 支持 --remove-vcs 和 --no-install,但依然不处理包内测试目录——它只是克隆后删掉 .git,和安装无关。
有没有运行时清理的补救办法?
有,但属于事后补刀,不推荐作为常规流程:
- 用脚本在
composer install后递归删除:find vendor/ -name 'tests' -type d -prune -exec rm -rf {} + 2>/dev/null - 在
scripts里加 post-install-cmd:"rm -rf vendor/*/tests vendor/*/Tests vendor/*/test vendor/*/Test" - 风险:某些包把测试工具类放在
tests/但被生产代码引用(极少见),删了会报Class not found - CI 环境可接受,生产部署慎用——不如从源头约束包的发布质量
真正干净的做法,是推动上游包维护者正确配置 .gitattributes 或 archive.exclude。你自己发布的包,别忘了这一步。










