Composer 没有 archive 命令,它自 2.0 起被彻底移除;正确做法是用 git archive 基于 commit 和 composer.lock 打包源码,或通过 composer install 构建含 vendor 的可部署包。

Composer 没有 archive 命令,任何尝试运行 composer archive 的操作都会报错:Command "archive" is not defined。这不是配置问题,也不是版本太低——它从 Composer 2.0 起就被彻底移除,官方文档中已无痕迹。
为什么 composer archive 会报错且无法恢复
该命令在 Composer 2.2+ 所有稳定版中均不存在。ArchiveCommand 类是内部隐藏类,仅被 Packagist 或实验性 composer pack(2.5+)间接调用,不开放给用户。所谓“成功案例”,大概率是项目里装了第三方 bin 工具(如 vendor/bin/composer-archive),不是 Composer 自带功能。
- 强行找旧版(1.x 后期)也无效:它只打包源码,不含
vendor/,无法直接运行 - 所有声称“
composer archive --version=1.2.3”的写法都是错的——命令本身不存在,参数更无从谈起 - 即使升级到最新 Composer,也不会“恢复”这个命令
导出特定版本源码的正确路径
真正可控、可复现的做法是:基于 Git commit + composer.json 中的 version 字段,用 git archive 打包当前快照,并确保 composer.lock 与该 commit 一致。
- 先检出目标版本对应的 commit:
git checkout v1.2.3(或对应 tag/branch) - 确认
composer.lock文件存在且已提交——它必须随源码一起发布,否则部署时依赖无法锁定 - 用
.gitattributes控制归档内容,例如:/tests export-ignore、/.env export-ignore - 执行:
git archive --format=zip --output=myapp-1.2.3.zip HEAD
生成的 myapp-1.2.3.zip 就是该版本的纯净源码包,不含 .git/、未跟踪文件或敏感配置。
想打包“含 vendor 的可部署包”?别碰 archive
如果你实际想要的是能直接部署运行的包(即含优化后的 vendor/),git archive 不够用,必须走两步构建:
- 新建空目录,复制
composer.json和对应 commit 的composer.lock - 运行:
composer install --no-dev --optimize-autoloader --prefer-dist - 再用系统
zip或tar打包整个目录(含生成的vendor/和autoload.php)
漏掉 --optimize-autoloader 会导致运行时类加载极慢;漏掉 --no-dev 会混入测试工具,带来安全和体积风险。
容易被忽略的关键点
很多人以为“导出版本”只是换个命令参数,其实核心约束在 Git 快照 + lock 文件一致性。如果 composer.lock 是后来手动改的,或没随代码提交,那无论用什么方式打包,目标环境都可能还原出错误依赖。真正的版本控制不在命令行参数里,而在你是否严格遵循“commit → tag → lock 提交 → 归档”这一链路。


















