archive-format 不是有效配置项,正确字段名为 format 且仅在 composer.json 的 archive 段中生效,值只能为 zip 或 tar;压缩需额外使用 --compress 参数,如 --compress=gz 生成 .tar.gz。

archive-format 不是全局配置项,只在 composer.json 的 archive 段里生效
你不能在 ~/.composer/config.json 里写 "archive-format": "tar" 来“一劳永逸”——Composer 完全忽略它。这个配置只认项目根目录下 composer.json 中的 archive 对象,且字段名不是 archive-format,而是 format。
-
format只接受两个值:zip或tar;写成tar.gz、gzip、.zip都会被静默忽略,回退到默认zip -
directory(不是archive-dir)指定输出路径,必须是相对或绝对路径,不支持$HOME、~等变量或缩写 - 若要临时覆盖,用命令行选项:
composer archive --format=tar --dir=build/artifacts,优先级高于 JSON 配置
想打 .tar.gz?archive 原生不支持,得靠 --compress
composer archive 的 format 字段只控制容器类型(zip/tar),不负责压缩。想生成真正压缩过的包,得加 --compress 参数:
-
composer archive --format=tar --compress=gz→ 输出my-app-1.0.0.tar.gz -
--compress=bz2和--compress=xz也有效,但需系统有对应工具(tar命令支持即可) - 仅
--format=zip时,--compress无效(zip 本身已是压缩格式) - 注意:这不是配置项,不能写进
composer.json;每次要用就得带参数,或封装成脚本
打包内容默认不含 vendor 和 .git,别误以为是 bug
composer archive 的本质是「源码快照打包」,不是构建产物导出。它读取 composer.json,但完全跳过 vendor/、composer.lock(除非显式 include)、.git/、.env 等——这是设计使然,不是漏配。
- 常见错误:执行完
composer install后跑archive,发现没 vendor,以为失败了 → 其实正常 - 真要打包含依赖的完整运行包?得手动
zip -r或写脚本合并vendor目录 - 自定义排除可用
archive.exclude(如["/tests/", "*.log"]),路径以/开头表示从项目根匹配
文件名和输出位置由命令驱动,composer.json 不控制这些
archive 段里的 format 和 directory 只管“打什么格式”和“往哪放”,不决定“叫什么名”或“放哪个子目录”。文件名始终按 {name}-{version}.{ext} 自动生成(name 来自 composer.json 的 name 字段,会把 / 替换为 -)。
- 想改文件名前缀?必须用
--file=my-release,例如:composer archive --file=prod-v1.2→prod-v1.2.zip -
--dir是最终输出目录,不是archive.directory的子目录;两者冲突时,命令行参数胜出 - 如果
--dir=dist但dist/不存在,Composer 不会自动创建 —— 这点和文档写的“自动创建”不符,实际会报错,务必提前mkdir -p dist
最常被卡住的地方其实是字段名拼写(format 不是 archive-format)和压缩逻辑拆分(--compress 是独立开关)。一旦记混,就只能靠 --help 和反复试错——没有中间态。










