composer archive 命令自 composer 2.0 起已被彻底移除,因其功能单一、使用率低且缺乏排除规则、压缩级别等关键能力;推荐改用 zip 或 tar 等系统命令手动打包,并注意排除开发文件与敏感配置。

composer archive 命令早已被移除,从 Composer 2.0 开始就不再存在。如果你在文档或旧脚本里看到它,直接执行会报错:Command "archive" is not defined.
为什么 composer archive 找不到了
Composer 官方在 v2.0 中彻底删掉了这个命令,原因是它功能单一、使用率低,且和 Git 归档、zip 或构建脚本相比缺乏灵活性和可控性。它原本只是调用 PHP 的 ZipArchive 类简单打包 vendor/ 和项目文件,但没提供排除规则、压缩级别、路径重映射等关键能力。
- Composer 1.x 最后一个支持它的版本是 1.10.22(2022 年已停止维护)
- 所有现代 CI/CD 流程(GitHub Actions、GitLab CI)都改用
zip -r或tar -czf替代 - 即使你降级到 Composer 1.x,也建议避免依赖它——PHP 环境升级后容易出兼容问题
替代方案:用系统命令打包,更可靠
真正要发布可部署包时,你需要的是「排除开发依赖 + 清理无关文件 + 控制目录结构」,这些 composer archive 做不到,但几行 shell 就能搞定。
- Linux/macOS 下推荐:
zip -r myapp-release.zip . -x "vendor/*" -x "tests/*" -x "phpunit.xml" -x "composer.lock" -x ".git/*" -x "README.md"
- 如果要包含
vendor/(比如离线部署),先运行composer install --no-dev --optimize-autoloader,再打包 - Windows 用户可用 PowerShell:
Compress-Archive -Path . -DestinationPath myapp-release.zip -Exclude "*.git*", "tests", "phpunit.xml"
- 注意:不要依赖
composer dump-autoload --classmap-authoritative来“代替打包”——它只优化加载,不减少文件体积
想自动化?写个简单的 package script
在 composer.json 的 scripts 里加一条,比记命令更省事:
"scripts": {
"package": [
"@composer install --no-dev --optimize-autoloader",
"zip -r myapp-$(date -I).zip . -x \"vendor/composer/*\" -x \"tests/*\" -x \"*.md\" -x \".*\""
]
}
然后运行:composer run package。注意两点:
-
date -I在 macOS 上需换成date +%Y-%m-%d - 双引号和转义必须严格,否则 shell 解析失败,错误信息通常是:
zip error: Nothing to do! - 别把
composer.lock打进去——它只对开发环境有意义;生产包应以composer install为准
真正麻烦的不是怎么打包,而是搞清哪些该留、哪些该删、哪些要重命名。比如 .env.example 要打包,.env 绝对不能;public/index.php 是入口,但 public/.htaccess 可能得按目标服务器调整。这些细节,没有一个命令能替你判断。











