composer 没有内置 archive 命令,执行必报错“command 'archive' is not defined”;真正可靠方式是用 git archive 配合 .gitattributes 排除文件,或封装 php 脚本调用 ziparchive 类打包,并务必提前运行 composer install --no-dev --optimize-autoloader。

Composer 没有内置的 archive 命令——你执行 composer archive 一定会报错:Command "archive" is not defined。所有声称“直接运行就能打包”的教程,要么基于已废弃插件,要么混淆了 git archive 或自定义脚本。
为什么 composer archive 在你机器上根本不存在
官方 Composer 二进制中从未实现过 archive 命令。它不在 composer list 输出里,文档里查不到,源码里也找不到对应类。所谓“支持 --format、--dir”的用法,实际来自两个早已失效的来源:
- 早期第三方插件(如
composer-archive-plugin),最后一次更新是 2018 年,不兼容 Composer 2.x,且无维护 - 部分用户把
git archive命令误记为 Composer 原生命令(git archive --format=zip -o app.zip HEAD才是真的可用命令)
你在终端敲下 composer archive 的那一刻,Shell 就在找一个根本没注册的命令——失败是确定的,不是配置问题,也不是权限问题。
真正能落地的打包方式:用 git archive + .gitattributes
如果你项目托管在 Git 中(绝大多数情况如此),这是最干净、可追溯、无需额外依赖的打包路径。它天然只打包 git ls-files 能看到的文件,自动排除 .git/、vendor/、node_modules/ 等非 tracked 内容。
实操步骤:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 在项目根目录创建
.gitattributes,写入要排除的路径,例如:tests/** export-ignore docs/** export-ignore .env export-ignore *.log export-ignore
- 确保当前工作区干净(
git status无未提交变更),打一个 tag(如v1.2.0)或确认要打包的 commit 已推送 - 运行:
git archive --format=zip --output=release-1.2.0.zip v1.2.0
生成的 zip 包不含 vendor/,部署时需在目标环境运行 composer install --no-dev --optimize-autoloader 补齐依赖。
需要连 vendor/ 一起打包?别用 scripts 写 zip -r
很多团队想“一键打包含 vendor 的完整可运行包”,于是往 composer.json 的 scripts 里塞 zip -r deploy.zip . -x "node_modules/*"。这在 CI/CD 或 Windows 上极易失败:
-
zip命令在 Windows cmd 中不可用;Git Bash/WSL 下参数又和 macOS/Linux 不完全兼容(比如-x排除语法) -
scripts执行时不加载项目 autoloader,也无法做条件判断(比如“只有 tag 才打包”) - 没错误捕获:某次
zip因权限失败,整个构建流程静默跳过,直到部署时报Class not found
正确做法是封装成 PHP 脚本:
scripts/archive.php,开头
require __DIR__.'/../vendor/autoload.php';,用 ZipArchive 类逐个 addFile() 或 addGlob(),显式控制哪些路径加入、哪些跳过(vendor/、.git/、tests/),最后调用 $zip->close() 并检查返回值。打包前必须完成的三件事,否则部署必出问题
哪怕你用 git archive 或自定义 PHP 脚本生成了 zip,如果跳过以下任一环节,上线后大概率报错:
-
composer dump-autoload --optimize --no-dev:生成高效autoload_classmap.php,避免部署时因 classmap 缺失导致Class not found -
cp .env.example .env && sed -i 's/APP_ENV=local/APP_ENV=production/' .env:确保.env不随包发布,或至少不带敏感值(.gitattributes里应含.env export-ignore) -
composer validate+php -l src/YourClass.php:验证composer.json合法性与关键文件语法,避免 zip 里塞进有 parse error 的代码
最容易被忽略的是 autoload 优化——很多人以为 vendor/ 里有 autoload 文件就万事大吉,但没跑 dump-autoload --optimize 的项目,在无 OPcache 的环境里会反复扫描 psr-4 映射,启动慢、还容易漏类。










