archive.exclude 仅在执行 composer archive 时影响自身包的打包内容,对 composer install/update 安装第三方包无效;它不控制 vendor 目录体积或运行时行为。

直接说结论:archive.exclude 不是全局配置,它只在你打包自己发布的包时起作用,对 composer install 或 composer update 下载的第三方包完全无效。
archive.exclude 是给 packagist 发布者用的
这个配置写在 composer.json 里,目的是控制你执行 composer archive(或 packagist 自动打包)时,哪些文件不被打进 zip/tar 包。它不影响依赖安装过程,也不影响 autoload、autoload-dev 或任何运行时行为。
常见错误现象:composer install 后发现 vendor 里还是有测试文件、docs、.git 目录——这不是 archive.exclude 没生效,而是它压根就不管这事。
- 只在你主动运行
composer archive时生效 - 只影响你自己的包被打包时的内容,不影响别人怎么装你的包
- 第三方包是否含 test/README.md,取决于对方的
archive.exclude,你改不了
想减小 vendor 体积?别碰 archive.exclude,用 installers 或 --no-dev
真正能缩小 vendor/ 的方法,和 archive.exclude 完全无关:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 加
--no-dev:跳过require-dev里的包,上线部署必须加 - 设
"config": {"preferred-install": {"*": "dist"}}:强制走 zip 包而非 git clone,避免带 .git - 用
composer install --optimize-autoloader --no-dev:合并 autoloader + 剔除开发依赖 - 某些包支持自定义 installer(如
composer/installers),但这是扩展机制,不是排除逻辑
archive.exclude 的写法和陷阱
它只接受字符串数组,路径是相对于包根目录的,不支持通配符嵌套或正则:
{
"archive": {
"exclude": [
"/tests/",
"/Tests/",
"phpunit.xml",
".travis.yml",
"CHANGELOG.md"
]
}
}
容易踩的坑:
- 开头加
/表示绝对路径匹配(从包根开始),不加表示子路径包含匹配,但实际行为不稳定,建议统一加/ -
**、*、?都不支持——别写"/*.md",它不会生效 - 路径区分大小写,
/tests/不会排除/Tests/,得分开写 - 它不递归过滤子目录下的同名文件,比如
/tests/排除了整个 tests 目录,但/src/tests/仍存在
最常被忽略的一点:你看到的 vendor 里那些“多余文件”,99% 是包作者没配 archive.exclude,或者配错了路径;你本地改自己项目的这个字段,对它们毫无影响。










