composer 没有公开的 archive 命令,它只是内部隐藏类,用户直接执行必报错;可靠做法是先 composer install --no-dev --optimize-autoloader,再用系统 zip/tar 排除无关文件打包。

Composer 没有 archive 命令——你执行它一定会报错:Command "archive" is not defined.这不是你装错了,也不是版本低,而是官方从没把它作为用户可用命令开放过。所有声称“composer archive --format=zip 就能打包”的教程,要么过时,要么混淆了第三方工具或内部调试命令。
为什么 composer archive 总是失败
Composer 的 ArchiveCommand 是隐藏的内部类,仅被 Packagist 或 composer pack(2.5+ 实验性)间接调用。它不接受用户直接调用,也不出现在 composer list 输出中。你查不到它的文档,是因为它根本不是给开发者用的。
- 运行
composer archive:必定报错,无例外 - 看到别人成功了?大概率他们项目里装了第三方 bin 工具(如
vendor/bin/composer-archive),不是 Composer 自带的 - Composer 2.2+ 所有稳定版均未包含该命令,官方文档也已彻底移除相关说明
真正可靠的做法:两步走,install + 系统归档
生产部署要的不是“一键打包”,而是“可控、可验证、不含垃圾文件”。核心就两步:先让 vendor/ 干净可用,再用系统命令打干净包。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 第一步,精简依赖:
composer install --no-dev --optimize-autoloader --prefer-dist - 第二步,排除无关文件打包(Linux/macOS):
zip -r myapp-$(date -I).zip . -x ".git/*" -x "tests/*" -x "phpunit.xml*" -x "docker/*" -x "Dockerfile" -x "node_modules/*" - Windows 用户请用 Git Bash 或 WSL,原生 CMD 的
zip不支持-x排除,不可靠 - 别漏掉
composer.lock:它体积大、部署时不需重解析,应排除;但若目标环境要离线install,就得手动保留
想自动化?写 scripts,别信插件
把逻辑写进 composer.json 的 scripts,比依赖未知第三方工具更透明、更易调试。
- 在
composer.json中加一段:
"scripts": {
"package": [
"@composer install --no-dev --optimize-autoloader",
"zip -r myapp-$(date -I).zip . -x \"vendor/composer/autoload_classmap.php\" -x \".git/*\" -x \"tests/*\""
]
}
composer run package(Composer 2.5+)或 composer run-script package(旧版)rm -rf vendor 或删 .git,那会破坏本地开发环境替代方案:用 git archive 更干净
如果你项目用 Git 管理,git archive 是最接近“真实发布快照”的方式——它只打包当前 commit 的源码,天然不含 vendor/、node_modules/、.git/。
- 先配好
.gitattributes文件,声明哪些路径不参与归档:/tests export-ignore、/docs export-ignore、/.env export-ignore - 再执行:
git archive --format=zip --output=myapp-v1.2.0.zip HEAD - 打包后必须单独运行:
composer install --no-dev --optimize-autoloader,否则vendor/autoload.php不存在 - 这个流程天然规避了误打包本地配置(如
.env)的风险,上线前建议跑一次:php -r "require 'vendor/autoload.php'; echo 'OK';"
最容易被忽略的不是怎么打包,而是打包后没验证能否 require 成功,以及是否把 .env 或 phpunit.xml 这类敏感/冗余文件一起塞进了生产包。只要这一步没做,前面所有操作都可能白忙。










