archive-format 配置仅在 composer archive 命令中生效,需写在项目根目录 composer.json 顶层,值为 "zip" 等合法字符串,命令行 --format 参数优先级更高。

composer archive-format 设置在哪生效
这个配置只在 composer archive 命令中起作用,不是全局打包行为的默认格式。它不会影响 composer install、composer update 或 composer dump-autoload 的任何环节——别指望靠它改变 vendor 解压方式或 autoload 行为。
常见错误现象:composer archive 打出来的包还是 tar,或者报错 archive-format is not defined,基本是因为没写对位置或没触发命令。
- 必须写在项目根目录的
composer.json里,不是~/.composer/config.json - 必须放在顶层对象中,不能嵌套在
config外的其他字段下 - 值只能是字符串:
"zip"、"tar"、"tar.gz"、"tar.bz2"(注意下划线是非法字符,"zip_composer"会直接被忽略)
怎么正确配置 zip 格式
编辑项目根目录下的 composer.json,在顶层添加 archive-format 字段:
{
"name": "my/package",
"description": "example",
"archive-format": "zip"
}
然后运行:composer archive --format=zip 或直接 composer archive(只要没传 --format 参数,就会读这个配置)。
注意:如果命令行显式传了 --format=tar,它会覆盖 composer.json 里的设置;命令行参数优先级高于配置文件。
-
archive-format是纯字符串,不支持模板变量(比如不能写"${name}-${version}.zip") - Windows 下生成 zip 更稳定,Linux/macOS 默认可能缺
zip命令,会 fallback 到 tar,此时要确保系统已安装zip工具 - PHP 必须启用
zip扩展,否则即使写了"zip"也会静默失败或退回到 tar
为什么有时设了也不生效
最常踩的坑是混淆了「归档命令」和「发布流程」。Composer 官方推荐的发布方式是 composer publish(需 Packagist API key),而 archive 是个冷门的本地打包辅助命令,连 Packagist 都不认它输出的 zip 包。
- 执行
composer archive前,当前目录必须是合法的 Composer 包(有composer.json且含name字段) - 如果
composer.json里没有version,archive会尝试从 git tag 推断,失败则报错退出,根本不会走到 format 解析那步 - 某些旧版 Composer(archive-format 支持不完整,建议用
composer --version确认 >= 2.2.0
替代方案:不想依赖 archive 命令怎么办
如果只是想快速打 zip 包发给同事或部署到某台没 Composer 的机器,更可靠的做法是绕过 Composer 自带命令:
- 用系统命令:
zip -r mypackage.zip vendor/ composer.json composer.lock(记得排除.git和node_modules) - 写个简单脚本,在
scripts里加一条:"package-zip": "zip -r ${NAME:-project}.zip vendor/ composer.json composer.lock",然后跑composer run package-zip - CI 场景下,直接用 GitHub Actions / GitLab CI 的打包步骤,比依赖
composer archive更可控
真正容易被忽略的是:Composer 的 archive 功能本质是个玩具级工具,连基础的 exclude 规则都不支持(比如没法跳过测试文件夹),一旦项目结构稍复杂,就该换别的方案了。










