composer 官方不支持 archive 命令,所谓 --file 参数实为混淆 git archive 或已废弃插件;精确控制归档名应使用 git archive + .gitattributes 过滤,且 composer.json 的 archive 配置被官方忽略。

composer archive --file=xxx 根本不生效,因为命令不存在
你执行 composer archive --file=myapp-v1.2.0 一定会报错:Command "archive" is not defined。这不是拼写错误或权限问题,而是 Composer 官方二进制里压根没实现这个命令——所有版本(包括最新的 2.9.6)都不含 archive 子命令。所谓“支持 --file”“支持前缀命名”的教程,基本混淆了以下三者之一:git archive、已废弃的第三方插件(如 composer-archive-plugin),或私有项目中自定义的 vendor/bin/composer-archive 脚本。
真正能控制文件名前缀的只有 git archive
如果你需要精确控制归档文件名(比如固定为 myapp-prod-v1.2.0.zip),git archive 是目前最可靠、无依赖、可复现的方式。它直接读取 Git 索引,输出名完全由你指定:
-
git archive --format=zip --output=myapp-prod-v1.2.0.zip HEAD:用当前 HEAD 打包,文件名完全自定义 -
git archive --format=zip --output=release-$(git describe --tags --abbrev=0).zip v1.2.0:自动插入 tag 名作前缀 - 注意:路径不能含空格或特殊字符,否则 shell 可能截断;建议用双引号包裹
--output="myapp-v1.2.0.zip"
想保留 composer.json 并排除敏感文件?靠 .gitattributes,不是 --exclude
composer archive 不支持 --exclude 参数,但 git archive 通过 .gitattributes 实现更稳定、更透明的过滤。在项目根目录建该文件,写入:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
tests/** export-ignore .env export-ignore *.log export-ignore docker-compose.yml export-ignore
这些规则对 git archive 立即生效,且不会被误提交到仓库(.gitattributes 本身也不会被打包)。关键点:
- 每行一个模式,结尾必须是
export-ignore(不是ignore或其他) -
**支持递归匹配,但/*.log这种写法无效,应写成*.log - 修改后无需
git add -f,git archive每次都重新读取文件内容
别指望 composer.json 的 archive 配置自动起作用
有些文档说在 composer.json 里加 "archive": {"format": "zip", "directory": "dist"} 就能控制打包行为——这仅在极少数旧版第三方插件中有效。官方 Composer 完全忽略该字段。如果你看到它“好像生效了”,大概率是因为:
- 项目里装了
robloach/component-installer或类似私有封装脚本 - CI/CD 流程中预埋了自定义
make package或composer run package命令 - 你实际运行的是
vendor/bin/composer-archive,而非composer archive
这种依赖不可移植、不可审计,上线前务必确认脚本来源和行为边界——尤其是它是否真的跳过了 vendor/ 和 node_modules/。










