镜像源不支持archive.excludes。它仅原样同步packagist已构建的dist包,不解析、不执行该规则,也不参与打包流程;排除效果取决于包作者是否用新tag触发git archive重建zip。

镜像源根本不执行archive.excludes规则
镜像源(如阿里云、腾讯云)不解析也不应用 archive.excludes,它只原样同步 Packagist 已构建好的 dist ZIP 包。哪怕你在自己的 composer.json 里写了 "archive": {"excludes": ["tests/", "docs/"]},镜像也不会重新打包——它连源码仓库都不拉,更不会跑 composer archive 命令。
你看到的“excludes”信息,只是 Packagist 页面上从包作者 composer.json 里读出来展示的元数据,和实际 ZIP 内容无关。
- 旧 tag 的 ZIP 不会因作者后续修改
archive.excludes而自动刷新 - 镜像同步的是成品 ZIP,不是构建逻辑
- 私仓若用
"type": "composer",同样无法触发排除——因为它的packages.json只含dist.url,不含任何构建配置
真正起作用的是 .gitattributes + git archive
能否在 ZIP 里剔除 tests/ 或 docs/,取决于 Packagist 构建时是否调用 git archive,以及项目根目录是否存在生效的 .gitattributes 文件(含 export-ignore 规则)。
主流镜像源分发的 ZIP 是 Packagist 官方构建的,而 Packagist 默认用 git archive 打包,所以会尊重 .gitattributes;但如果你自己搭私仓并手动 zip -r 打包,那 .gitattributes 就完全被忽略。
-
export-ignore在镜像源中「不生效」——镜像不参与打包,但它对最终用户「有效」,前提是上游 ZIP 确实按此规则生成 - GitHub “Download ZIP” 按
.gitattributes过滤,但镜像源不走这一步,它拿的是 Packagist 已打好的包 - 验证方式:下载一个包的 dist ZIP,解压后直接看有没有
tests/目录,别信页面显示的 excludes 文字
想让 vendor 里没 tests/,只能靠作者打新 tag
镜像源不重建、不重打包、不校验规则——它就是个静态缓存代理。你想让某包的 ZIP 干净,唯一可靠路径是:包作者提交新 commit → 打新 tag → Push 到 GitHub/GitLab → Packagist 自动触发构建(用 git archive + .gitattributes)→ 镜像同步这个新 ZIP。
- 改
archive.excludes后不打新 tag?旧 ZIP 里的tests/依然在 vendor 里 - 私仓想控制内容,必须改用
"type": "package",显式指定每个包的dist.url,且该 URL 必须指向已按规则构建好的 ZIP - CI 中手动构建 ZIP 时,务必用
git archive --format=zip --output=xxx.zip HEAD,而非zip -r
为什么换镜像后 vendor 还有 tests/?不是镜像的问题
换源后 vendor/ 里仍有 tests/ 目录,99% 和镜像无关——它要么是旧 ZIP 缓存没清,要么是作者根本没为当前 tag 生成干净包。镜像只负责转发,不负责净化。
- 运行
composer clear-cache再composer install,确认拉的是最新 ZIP - 检查该包最新 tag 在 Packagist 页面是否显示 ZIP size 变小了(可能说明重建过)
- 别指望镜像能“过滤”或“重写” ZIP 内容——它连 ZIP 文件头都不打开











