Composer 没有原生 archive 命令,所有 --format 用法均来自已弃用或不兼容的第三方插件;官方自 2.0 起彻底移除该命令,执行必报“Command ‘archive’ is not defined”,正确做法是先运行 composer install --no-dev --optimize-autoloader,再用 zip 或 tar 手动打包并排除无关文件。

Composer 没有原生 archive 命令,更不存在 --format 参数——你看到的用法基本来自第三方插件或过时文档。
为什么 composer archive --format=zip 会报错或无效
Composer 官方自 2.0 起就未内置 archive 子命令。所有带 --format 的调用,实际依赖的是已弃用/不兼容的第三方插件(如 hirak/prestissimo),而该插件在 Composer 2.2+ 中因 TarArchiver 类被移除而彻底失效。运行时常见错误包括:
-
Command "archive" is not defined.(官方版本直接报此错) -
Class "Composer\Package\Archiver\TarArchiver" not found(插件加载失败) - 明明写了
"archive-format": "tar"却仍输出.zip(配置被完全忽略)
composer.json 里写 archive-format 真的有用吗
没用,除非你装了特定插件且版本严格匹配。官方 Composer 从不读取 archive-format 字段。即使你把它写在项目根目录 composer.json 顶层:
- 值设为
"tar.gz"、"zip_composer"或"gzip"—— 全部静默忽略,回退到默认zip - 正确值只允许
"zip"或"tar",但仅对某些插件生效,非标准行为 -
~/.composer/config.json里写该字段,100% 无任何效果
真正能稳定生成 .zip 或 .tar.gz 的做法
绕过插件,用系统命令组合,兼容 Composer 2.5+ 且无版本焦虑:
- 打干净源码包(不含
vendor):zip -r myapp-1.0.0.zip . -x "vendor/*" ".git/*" "node_modules/*" "*.log" - 打含优化后
vendor的运行包:composer install --no-dev --optimize-autoloader && tar -czf myapp-1.0.0.tar.gz --exclude="vendor/bin" --exclude="*/tests" --exclude=".git" . - 封装进
composer.json的scripts:"archive:prod": "composer install --no-dev --optimize-autoloader && zip -r dist/myapp.zip . -x \"vendor/bin/*\" \"vendor/*/tests/*\" \".git/*\"",然后运行composer run archive:prod
容易被忽略的关键点
很多人卡在“为什么排除不了 tests/”,其实是因为:
-
archive.exclude只在插件中有效,且路径必须以/开头(如"/tests"),写成"tests/"不匹配 - Composer 原生命令根本不读
.gitignore,也不支持**通配符 -
--dir=./dist要求dist/目录必须已存在,否则直接失败,不会自动创建父级 - 版本号强制依赖
composer.json中的version字段,空值或格式错误(如"2.1"缺少补零)会导致文件名含dev-前缀,不可用于自动化发布


















