Composer没有archive命令,执行必报错;可靠打包需三步:先运行composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction,再清理vendor中tests、bin等敏感目录,最后用tar或zip系统命令归档并排除.git、node_modules等无关文件。

Composer 没有 composer archive 命令
直接输 composer archive 会报错:Command "archive" is not defined.。这不是你装错了,是官方根本没提供这个命令——Composer 源码和文档里都查不到它。所有声称“用 composer archive 打包”的教程,基本是把 tar、zip 或自定义脚本误标为 Composer 原生命令。
真正能打出线上可用包的命令组合
打包不是一步动作,而是“安装精简依赖 + 清理危险文件 + 系统归档”三步闭环。核心命令必须带这些参数:
composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction- 不加
--no-dev→phpunit、infection全进生产环境 - 漏掉
--optimize-autoloader→ 每次请求都扫描 PSR-4 目录,类加载慢 3–5 倍 - 缺
--classmap-authoritative→ autoloader 仍 fallback 到文件系统,失去 classmap 加速意义 - 没
--no-interaction→ CI/CD 流水线卡死(无 TTY)
打包前必须手动清理 vendor 中的冗余内容
composer install 只负责装,不负责删。以下目录不清理,上线就是安全风险:
-
vendor/bin/:含phpunit、phpcs等可执行文件,可能被 Web 路径遍历触发 -
vendor/**/tests/和vendor/**/Tests/:测试代码不该出现在生产环境 -
vendor/composer/installed.json:含完整包清单和版本哈希,攻击者可借此探测组件漏洞 -
vendor/**/.git:部分包带子模块 git 信息,泄露开发历史
推荐用 find vendor -name 'tests' -type d -prune -exec rm -rf {} + 这类命令批量清理,别靠肉眼翻。
最后用系统命令完成归档
归档动作必须在项目根目录执行,且要排除开发无关内容:
- Linux/macOS:
tar -czf release-$(date +%Y%m%d-%H%M).tar.gz --exclude='node_modules' --exclude='.git' --exclude='tests' --exclude='vendor/bin' . - Windows(PowerShell):
Compress-Archive -Path . -DestinationPath "release-$(Get-Date -Format 'yyyyMMdd-HHmm').zip" -Exclude node_modules,.git,tests,vendor\bin - 必须包含
composer.lock:它是部署一致性的唯一凭证,缺了就等于没打包
如果反复在不同机器上解压运行失败,大概率是跳过了 composer install 流程,只拷了 vendor/ 目录——vendor 不是静态资源,是安装产物,换环境必须重装。











