Composer没有archive命令,执行会报错;可靠打包方式是先运行composer install --no-dev --optimize-autoloader,再用系统zip/tar命令手动压缩并排除无关文件。

composer archive 命令不存在,别白敲了
Composer 没有内置的 archive 命令。你执行 composer archive 会直接报错:Command "archive" is not defined.。这是很多人第一次尝试时卡住的地方——官方文档里根本查不到这个命令,它压根就不在 Composer 的命令列表中。
想打包项目?用 composer archive 的替代方案只有两个
真正能达成“把当前项目(含 vendor)打包成 zip/tar”的需求,可靠做法只有:
- 手动用系统命令打包,比如
zip -r myapp.zip . -x "vendor/composer/*" -x "node_modules/*"(注意排除无关目录) - 用 Composer 的
archive功能,但仅限于 发布包 场景:在composer.json中配置"archive": { "exclude": ["..."] },再配合composer archive—— 等等,这又绕回来了?
真相是:那个看似存在的 archive 功能,其实是 Composer 插件机制的一部分,默认不启用,需要额外安装插件(如 hirak/prestissimo 不提供,composer-archive-plugin 已多年未维护且不兼容 Composer 2+)。所以实际没人用。
最稳的打包方式:用 composer install --no-dev + 系统压缩
生产环境打包的核心诉求其实是:只保留运行必需的文件(不含开发依赖、测试代码、.git 目录等)。推荐流程如下:
- 先清理:运行
composer install --no-dev --optimize-autoloader,确保vendor/autoload.php是精简过的 - 再排除:用
zip或tar手动打包,明确指定要排除的路径,例如:zip -r deploy.zip . -x ".git/*" -x "tests/*" -x "phpunit.xml" -x "composer.lock" -x "README.md"
- 注意
composer.lock是否要包含:如果目标环境要重装依赖,就别打进去;如果要锁定版本并离线安装,就得留着 - Windows 用户请用 Git Bash 或 WSL 执行,原生 cmd 的
zip命令不可靠
为什么不用第三方 archive 插件
目前 GitHub 上搜到的 composer-archive-plugin 类项目存在几个硬伤:
- 最后一次更新是 2018 年,不支持 Composer 2.x 的插件 API
- 排除逻辑写死在插件里,没法灵活控制哪些文件夹该进包(比如你可能想保留
docs/但排除examples/) - 打包行为被封装在插件里,出问题难调试,错误信息也不直观(比如权限拒绝、路径不存在,只会报 “Archive failed”)
- 引入额外依赖,反而增加 CI/CD 流水线的维护成本
真正上线打包时,可控性比“少敲一行命令”重要得多——手写一条 zip 命令,配上清晰的 -x 排除列表,才是多数团队落地的选择。










