composer 没有内置 archive 命令,标准做法是先运行 composer install --no-dev --optimize-autoloader,再手动复制必要文件到临时目录并压缩,确保排除开发依赖和无关文件。

composer archive 命令根本不存在
Composer 没有内置的 archive 子命令,也**不提供项目打包归档功能**。你搜到的所谓“composer archive”要么是第三方插件,要么是混淆了其他工具(比如 git archive 或 zip 命令)。
用 composer install --no-dev + 手动压缩才是标准做法
生成生产环境可用的归档包,核心是:只保留运行时依赖、排除开发依赖和无关文件(如 tests/、.git/、vendor/bin/ 等),再压缩。实际操作分三步:
-
composer install --no-dev --optimize-autoloader:确保vendor/干净,且自动加载器已优化 - 准备一个临时目录,复制
composer.json、composer.lock、index.php(或入口文件)、vendor/和必要源码 - 用系统命令打包:
zip -r app-release.zip ./app-dir(Linux/macOS)或tar -czf app-release.tgz ./app-dir
注意:不要直接压缩整个项目根目录——node_modules/、.env、var/log/ 这类文件必须提前排除。
想自动化?写个 shell 脚本比找插件更可靠
社区里有些叫 composer-archive-plugin 的第三方包,但维护停滞、兼容性差,且会把 vendor/ 里的许可证文件、测试代码一并打进包,反而增大体积、引入合规风险。
一个轻量可靠的替代方案是写几行脚本:
#!/bin/bash rm -rf build/ mkdir build cp -r src/ public/ composer.json composer.lock index.php build/ cd build && composer install --no-dev --optimize-autoloader --quiet cd .. && zip -r release-$(date +%Y%m%d).zip build/
关键点:
- 显式指定要复制的目录,不靠
rsync -av --exclude这类易漏的过滤 -
--quiet避免输出干扰 CI 日志 - 时间戳命名防止覆盖,适合持续交付场景
为什么不用 git archive?它绕不开 vendor 目录
git archive 只能打包 Git 跟踪的文件,而 vendor/ 默认不在 Git 中(.gitignore 里写了)。强行加进去会导致仓库膨胀、冲突频发,违背 Composer 设计初衷。
真正需要归档的,是「安装后」的可部署结构,不是「源码快照」。所以必须先 composer install,再打包结果目录——这个顺序不能颠倒,否则线上 require 会失败。
容易被忽略的是 autoload-files 和 classmap 的生成时机:只有执行过 install 或 dump-autoload,vendor/autoload.php 才真正可用。没这一步,压缩包解压后直接报 Class not found。










