archive-format 控制 composer archive 命令生成的压缩包格式,合法值仅有 zip 和 tar;archive-dir 指定输出路径,相对于项目根目录,需手动创建父目录,字段实际为 format 和 directory,位于 composer.json 的 archive 对象内。

archive-format 是什么,哪些值合法
archive-format 控制 composer archive 命令生成的压缩包格式,它不是全局配置项,只能在 composer.json 的 archive 段中定义。合法值只有两个:zip 和 tar(注意不支持 tar.gz 或 tgz 等变体)。
如果设为其他值(比如 gzip),Composer 会静默忽略,回退到默认的 zip,不会报错也不会警告——这点容易踩坑。
- Windows 用户建议用
zip(兼容性最好) - Linux/macOS 部署场景若需与
tar工具链配合,可选tar,但要注意解压时得用tar -xf而非unzip - 不能写成
.zip或zip+,只接受纯字符串zip或tar
archive-dir 怎么指定输出路径,相对路径怎么算
archive-dir 决定打包文件写入的位置,也是仅在 composer.json 的 archive 段中生效。它的值是相对于项目根目录(即 composer.json 所在目录)的路径。
例如设置 "archive-dir": "dist",最终包会生成在 ./dist/my-package-1.0.0.zip;设为 "archive-dir": "../releases",则输出到上层目录的 releases/ 下。
- 路径末尾不加斜杠也行,Composer 会自动处理
- 目录不存在时,Composer 不会自动创建,会直接报错:
Could not create archive: failed to open stream: No such file or directory - 不支持环境变量(如
$HOME/dist)或波浪号(~/dist),必须是纯相对或绝对路径
如何在 composer.json 中正确配置这两个选项
它们必须一起放在 archive 对象里,不能放到 config 或根级。常见错误是把它们误当成全局配置写进 ~/.composer/config.json——那完全无效。
{
"name": "myvendor/mypackage",
"version": "1.0.0",
"archive": {
"format": "tar",
"directory": "build/artifacts"
}
}
注意字段名是 format 和 directory,不是 archive-format 或 archive-dir——文档里写的“archive-format”只是说明用途的描述性名称,实际 key 就是这两个简短形式。
- 执行打包命令:
composer archive(无需额外参数) - 若想临时覆盖配置,可用
--format=zip或--dir=dist命令行选项,优先级高于 JSON 配置 - 该功能只对本地项目有效,不作用于
require的依赖包
打包时容易被忽略的细节
Composer 的 archive 功能本质是 zip/tar 当前项目源码(不含 vendor、tests 等默认排除项),不是构建产物。它不运行 scripts,也不触发 autoload-dump,所以别指望它生成可直接运行的发布包。
-
archive不读取.gitattributes的export-ignore,只认 Composer 自己的archive.excludes配置(需手动加) - 如果项目用了
path仓库类型,composer archive仍会打包当前目录内容,不会去拉取 path 指向的真实路径 - 没有内置的版本号模板(如
{version}占位符),生成的文件名固定为{name}-{version}.{format},无法自定义前缀或后缀










