Composer没有archive命令,执行必报“Command 'archive' is not defined”;它仅负责依赖管理,归档须用git archive或composer install配合系统压缩工具。

Composer 本身不提供打包功能,composer archive 命令根本不存在,所有看似“能用”的案例都来自第三方插件或自定义脚本,不可靠、不兼容、易失效。
为什么不能直接写 composer archive
执行该命令会明确报错:Command "archive" is not defined。Composer 官方从没实现这个命令——它只管依赖解析、安装和 autoloader 生成,不处理归档、压缩、路径排除等部署层逻辑。你看到的教程或 CI 脚本里出现它,基本是以下三种情况之一:
- 装了第三方插件(如
hirak/php-archive),行为完全由插件控制,升级或卸载后立即失效 - 项目
composer.json中定义了自定义 script:"archive": "zip -r dist/app.zip . -x 'vendor/*' '.git/*'",本质是调用系统zip命令 - 把
git archive或tar命令误记为 Composer 原生命令
真正可复现的打包方案怎么配
可靠打包必须绕过“虚构命令”,用真实、可控、环境无关的组合操作。关键不是“一行命令”,而是“明确每一步谁负责什么”:
- 源码快照(不含
vendor):用git archive --format=zip --output=release.zip HEAD,天然排除.git/、node_modules/,但记得手动把composer.lock加回去(git archive默认不包含它) - 含
vendor的可部署包:先运行composer install --no-dev --optimize-autoloader,再用zip -r deploy.zip . -x "tests/*" ".git/*" "node_modules/*" - 统一触发入口:在
composer.json的scripts里定义,例如:"deploy:package": ["composer install --no-dev --optimize-autoloader", "zip -r dist/app-$(jq -r '.version' composer.json).zip . -x 'tests/*' '.git/*'"],然后用composer run deploy:package执行
composer.json 里 scripts 字段怎么防踩坑
很多打包脚本失败,不是命令写错,而是执行上下文失控:
- 别硬编码路径:
chmod -R 755 storage/在非项目根目录执行会失败;改用chmod -R 755 ${PWD}/storage - 别直写
php artisan:应走vendor/bin/artisan,避免 CLI 配置(如opcache.enable_cli)差异导致命令找不到类 - CI 环境下禁交互:所有
artisan命令加--no-interaction --ansi,比如vendor/bin/artisan config:clear --no-interaction - 权限问题常被忽略:部署用户 ≠ Web 用户,
storage/和bootstrap/cache/目录需显式chown或chmod,且脚本中要检查当前用户是否有权执行
打包的本质是环境收敛,不是命令堆砌。最易被忽略的一点:composer.lock 必须进包,否则目标机上 composer install 无法复现依赖——而几乎所有手写 zip 命令默认漏掉它,得单独 zip -u 补上或改用 tar --files-from= 精确控制文件列表。


















