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 内容。
实操步骤:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在项目根目录创建
.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 映射,启动慢、还容易漏类。

















