Composer 没有 archive 命令,所谓“composer archive”均非官方功能;正确流程是先在目标一致环境中执行 composer install --no-dev --optimize-autoloader,再用系统命令(如 tar 或 git archive)打包源码与 vendor 目录,并严格验证 autoload.php 可加载。

Composer 没有 archive 命令,也不存在“包含 vendor”的内置打包能力——任何声称 composer archive 能打出可运行包的方案,90% 会导致线上 Class not found 或 require vendor/autoload.php: No such file 错误。
执行 composer archive 一定报错:Command "archive" is not defined
这不是环境问题,是事实:Composer 官方从未发布过 archive 命令。你查 composer list、翻官方文档、看源码(src/Command/ 目录),都找不到 ArchiveCommand。所有能“跑通”的案例,要么是本地装了已废弃插件(如 composer-archive-plugin),要么是误把 git archive 或自定义脚本当成了 Composer 原生功能。CI/CD 流水线里一旦换镜像或升级 Composer,立刻失效。
想打包含 vendor/ 的完整可运行包,必须先 composer install 再系统归档
真正能落地的流程只有这一条路径,且每步不可跳过:
- 在与生产环境一致的机器上(相同 OS、PHP 版本、扩展,比如都是 Ubuntu 22.04 + PHP 8.2 + ext-redis)运行:
composer install --no-dev --optimize-autoloader --ignore-platform-reqs --no-plugins - 立即执行:
composer dump-autoload --classmap-authoritative,确保vendor/composer/autoload_classmap.php已生成且生效 - 确认
vendor/autoload.php可被直接 require:php -r "require 'vendor/autoload.php'; echo 'OK';" - 用系统命令打包,显式排除干扰项:
tar -czf app-release.tar.gz . --exclude=.git --exclude=node_modules --exclude=tests
注意:--ignore-platform-reqs 只为绕过安装阶段因缺扩展(如 ext-gd)导致中断,它不影响 autoloader 行为;但若目标机真缺关键扩展,打包后仍会运行失败——所以“一致环境”不是建议,是硬性前提。
composer pack 不是 archive 的替代品,别凑合用
Composer 2.5+ 确实加了实验性 pack 命令,但它和部署无关:
- 默认不打包
vendor/,只打源码(和git archive类似) - 输出路径固定为
vendor-bin/{name}-{version}.zip,无法指定目标目录 - 不触发
install、不优化 autoload、不校验平台兼容性 - 它面向的是“向私有 Packagist 发布 SDK 包”,不是“给内网服务器部署应用”
如果你在 composer.json 里配了 "archive": {"exclude": []},那字段只被 pack 和极少数 CI 工具识别,zip -r 或 git archive 完全无视它。
最容易被忽略的验证点:解压后第一行代码就该能跑通
打包不是终点,验证才是关键。上线前必须在目标环境(或 Docker 镜像)中做这三件事:
- 解压后进入目录,执行:
php -r "require 'vendor/autoload.php'; echo 'OK';" - 检查
vendor/composer/autoload_static.php是否存在,且其中的$classMap数组非空 - 确认
.env、docker-compose.yml、phpunit.xml等敏感或非运行时文件没混进去
跳过验证的打包,等于把故障提前埋进压缩包里——等流量进来才暴露,代价远高于多敲两行命令。


















