composer archive生成的文件名由composer.json的version字段直接决定,格式固定为{name}-{version}.{format};可通过--file参数自定义主体名,但扩展名由--format决定。

composer archive 生成的文件名怎么控制
文件名由 composer.json 中的 version 字段直接决定,不是模板也不是可配置字符串。它固定为 {name}-{version}.{format} 格式,比如 myorg/my-app-2.1.0.zip。
常见误解是以为能像 CI 脚本那样用变量拼接,但 composer archive 不支持自定义命名模板。你唯一可控的入口就是 version 字段本身——改它,就改了最终文件名。
-
version必须显式写在composer.json里;不写会导致生成dev-前缀(如myapp-dev-master.zip) - 如果项目用了 Git tag,
version仍以composer.json为准,tag 不会覆盖它 - 版本号中含非法字符(如空格、大写字母)不会报错,但可能让下游系统解析失败,建议只用数字、点、短横线(如
1.0.0或2.1.0-rc1)
--file 参数能绕过 version 吗
可以,但只影响文件名主体,不改变扩展名。加上 --file=prod-202610 后,输出就是 prod-202610.zip(或 .tar),完全跳过 name 和 version。
注意:这个参数不接受路径,只接受文件名(不含扩展名),扩展名由 --format 决定;而且 --file 和 --dir 必须配合使用,否则会报错。
-
composer archive --format=zip --file=myapp-v1 --dir=./dist→ 输出./dist/myapp-v1.zip -
--file值里不能带.zip或.tar,否则会变成myapp-v1.zip.zip - Windows 下建议统一用正斜杠
/写--dir,反斜杠\在某些 shell 里会被吃掉
为什么改了 version 还没生效
因为 composer archive 不读取 composer.lock,也不检查本地修改是否已提交。它只看当前工作目录下 composer.json 的原始内容。
最容易踩的坑是:编辑了 composer.json 但忘了保存,或者在 IDE 里改了却没写入磁盘;另一个是运行命令时不在项目根目录,导致读到的是父目录或其他项目的 composer.json。
- 执行前先
cat composer.json | grep version(Linux/macOS)或type composer.json \| findstr version(Windows)确认值已写入 - 确保当前 shell 工作路径是项目根目录(即
composer.json所在目录) - 不要依赖 Git dirty state——未提交的
version修改照样生效
想加时间戳或哈希怎么办
composer archive 本身不提供动态字段,得靠外部命令组合。最稳妥的做法是先生成归档,再重命名。
例如在 CI 脚本里:
composer archive --format=zip --dir=./dist --file=app mv ./dist/app.zip "./dist/app-$(date +%Y%m%d-%H%M).zip"
或者用 Git 提交哈希:
git rev-parse --short HEAD | xargs -I {} composer archive --format=zip --dir=./dist --file=app-{}
# 输出类似 app-a1b2c3.zip注意:别在 --file 里直接插命令替换(如 --file="app-$(date ...)"),不同 shell 对引号和子命令的处理差异很大,容易出错。
真正难的不是命名规则本身,而是意识到 composer archive 只是个轻量源码打包工具,它不负责构建逻辑、不介入 CI 流程、也不生成可部署产物——这些都得你自己补全。


















