Composer archive 生成的文件名来自 composer.json 的 name 和 version 字段,格式为 {name}-{version}.{format},其中 name 必须为小写 vendor/package 格式,version 需显式声明语义化版本;--file 可覆盖前缀但不能省略 version,archive.exclude 仅支持目录级前缀匹配排除。

Composer 导出(composer archive)本身不涉及“导出设置”的命名,它只读取 composer.json 中的 name 和 version 字段来生成归档文件名。所谓“命名”,本质是规范配置这两个字段,而非额外定义导出参数。
composer archive 生成的文件名从哪来
文件名格式固定为:{name}-{version}.{format},其中:
-
name必须是vendor/package格式,全小写、用短横线分隔单词(如acme/api-client);若含大写或下划线,composer archive不报错但会导致 Packagist 拒绝发布,也影响下游自动加载推断 -
version必须显式声明,推荐语义化版本(如"1.2.0");若为空或为dev-main类开发版,归档名会带dev-前缀(如acme-api-client-dev-main.zip),不利于分发 -
--file参数可覆盖默认文件名前缀,但不能省略version—— 它仍参与内部校验,缺失时命令可能失败
archive.exclude 怎么写才生效
archive.exclude 是 composer.json 中的数组字段,用于指定打包时排除的路径。它不支持正则,只做前缀匹配,且路径基准是项目根目录:
- 写
"tests/"或"/tests/"都能排除整个tests/目录;但"tests"(无尾部斜杠)可能误排除同名文件 - 排除
.git/不需要手动加——composer archive默认就跳过.git/、vendor/、node_modules/等常见目录 - 想排除
src/Helper.php?不行。该字段只支持目录级排除,不支持单文件 - Windows 下统一用正斜杠
/,比如"dist/",避免反斜杠被 shell 解析为转义
导出到自定义目录要注意什么
用 --dir=./releases 指定输出路径时,Composer 不会递归创建父级目录:
-
--dir=./a/b/c要求a/b已存在,否则报错Failed to create directory "a/b/c" - 路径必须使用相对或绝对路径,不能是环境变量(如
$HOME/build)——Composer 不解析 shell 变量 - 如果
--dir指向已存在文件(非目录),命令会静默失败,不报错也不生成归档 - 输出路径和
--file组合后,最终路径是{--dir}/{--file}.{--format},注意不要重复写扩展名(--file=app-v1.zip是错的,应写--file=app-v1)
真正容易被忽略的是:archive 不校验 name 是否已在 Packagist 注册,但如果你后续要发布,name 的 vendor 部分必须与 Packagist 账户完全一致(大小写、连字符都算),否则提交直接被拒——本地能打包,线上却发不出去,这个断层常发生在团队交接或账号迁移时。











