composer 没有 archive 内置命令,所谓教程多为混淆 git archive 或自定义脚本;正确做法是结合 composer install --no-dev --optimize-autoloader、git archive(推荐)或自定义 scripts 打包,并通过 .gitattributes 和 autoload 优化确保部署可靠性。

composer archive 命令根本不存在
Composer 没有 archive 这个内置命令,官方文档里查不到,执行 composer archive 会直接报错:Command "archive" is not defined.。你看到的所谓“教程”,基本是把 git archive、zip 手动打包,或者用自定义脚本冒充 Composer 功能。
真正能打包项目的 Composer 方式只有 dump-autoload + 自定义脚本
Composer 本身只管依赖安装和自动加载,不负责项目归档。但你可以借助它的钩子机制,在生成可部署包时自动清理无关文件:
-
composer install --no-dev --optimize-autoloader:确保vendor/只含生产依赖,且 autoloader 最小化 - 在
composer.json的"scripts"里加一个打包任务,比如:"scripts": { "archive": "zip -r myapp-$(date +%Y%m%d).zip . -x \"node_modules/*\" \"vendor/composer/autoload_classmap.php\" \"tests/*\" \".git/*\"" } - 然后运行
composer run archive(Composer 2.5+)或composer archive(旧版需用composer run-script archive)
用 git archive 更可靠,尤其适合发布版本
如果你项目用 Git 管理,git archive 是最干净的打包方式——它只打当前 commit 的源码,不含 vendor/、node_modules/、.git 目录等干扰项:
-
git archive --format=zip --output=myapp-v1.2.0.zip HEAD:打包最新提交 -
git archive --format=tar.gz --output=release.tar.gz v1.2.0:按 tag 打包,适合发版 - 注意:
vendor/不在 Git 中,所以打包后必须单独composer install --no-dev,这点不能漏
别忽略 autoload 优化和 .gitattributes
手动 zip 或 git archive 后,如果没做 autoload 优化,部署到目标环境可能加载慢甚至失败:
- 务必在打包前运行
composer dump-autoload --optimize --no-dev,生成扁平化映射表 - 在项目根目录加
.gitattributes文件,标记哪些文件不该进归档:vendor/** export-ignore tests/** export-ignore .php-cs-fixer.php export-ignore
- 这样
git archive就会自动跳过这些路径,比靠命令行-x参数更可控
最容易被忽略的是:打包后没验证 vendor/autoload.php 是否能正常 require,以及是否误打了本地配置文件(如 .env)。上线前至少跑一次 php -r "require 'vendor/autoload.php'; echo 'OK';"。










