composer没有archive命令,执行必报“command 'archive' is not defined”;正确做法是先运行composer install --no-dev --optimize-autoloader,再用git archive或zip打包,并通过.gitattributes排除无关文件。

Composer 没有 archive 命令,中文环境下执行它一样报错:Command "archive" is not defined。 所有“中文教程里写的 composer archive”都混淆了 git archive、第三方脚本或早已废弃的插件。冷数据迁移和归档打包是两件事,不能靠一个不存在的命令解决。
为什么 composer archive 在中文系统里也必然失败
这不是编码、locale 或终端乱码问题——根本原因是该命令从未被 Composer 官方实现。无论你用 CMD、PowerShell、Git Bash 还是 WSL,只要执行 composer archive,结果都是:
Command "archive" is not defined.
- Composer 2.0(2020 年底)起已彻底移除该命令,源码中查不到
ArchiveCommand注册逻辑 - 中文文档若仍保留此命令,说明内容未同步更新,属于过时资料
- 某些中文博客截图里的“成功运行”,实际是误把
git archive --format=zip -o app.zip HEAD当成 Composer 命令
git archive + .gitattributes 是最稳的中文环境归档方案
适合需要可追溯、无 vendor、不含敏感文件的发布包(如交付给客户或上传到私有仓库)。关键点不在语言,而在路径和规则写法:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
.gitattributes文件必须用 UTF-8 无 BOM 编码(Notepad++ 或 VS Code 默认即可),否则中文路径可能匹配失败 - 排除规则写法要严格:
/tests export-ignore(开头加/表示项目根目录起始),config/*.env export-ignore可排除所有 .env 变体 - Windows 下推荐用 Git Bash 执行:
git archive --format=zip --output=release-v1.0.0.zip HEAD,避免 PowerShell 的Compress-Archive对符号链接或长路径处理异常 - 生成的 zip 包天然不含
vendor/、.git/、node_modules/,部署时需在目标环境补composer install --no-dev --optimize-autoloader
要带 vendor/ 的冷数据迁移包,别信“一键压缩”
冷迁移指离线环境部署,要求包内含全部运行时依赖。这时不能只靠归档源码,但也不能盲目 zip -r 整个目录:
- 先确保
vendor/已精简:composer install --no-dev --optimize-autoloader --no-scripts - 手动排除高风险项:
-x "vendor/*/Tests/" -x "vendor/*/tests/" -x "vendor/bin/" -x ".env" -x "phpunit.xml"(注意 Windows 下zip不支持-x,必须用 Git Bash 或 7-Zip CLI) -
composer.lock必须包含——它是冷迁移的版本锚点,删了就无法保证composer install结果一致 - 验证环节不可跳过:
php -r "require 'vendor/autoload.php'; echo 'OK';"要在解压后立即执行,否则上线才发现 autoload 失败
自动化脚本里别写 rm -rf vendor 或 git clean
很多中文 CI 脚本为“干净打包”直接清理本地 vendor/,这会破坏开发者本地环境:
- CI 构建应基于干净 clone,而不是复用开发机上的 vendor 目录
- 打包脚本里用
composer install --no-dev --optimize-autoloader即可生成新 vendor,无需先删 - 如果用了
git archive,它根本不读 vendor 目录,删了也没用;如果用了zip -r,删 vendor 反而会让后续 install 失败 - 真正要隔离的是配置:用
.env.example替代.env,并在.gitattributes或-x参数中明确排除所有.env*
最容易被忽略的不是命令语法,而是 composer.lock 的存在意义和 .env 的实际路径——它们在中文路径下不会自动“变安全”,必须显式控制。










