composer archive 不能导出依赖,因为它仅归档项目源码(默认排除 vendor/),不解析或包含任何依赖;需先 composer install --no-dev --optimize-autoloader,再用 zip/7z 打包整个目录。

composer archive 不是导出依赖项的命令,它只打包当前项目本身(不含 vendor),且默认不包含 vendor/ 目录——想用它把依赖一起打成 zip 是行不通的。
为什么 composer archive 不能导出依赖
这个命令本质是「项目归档」,行为类似 git archive:它读取 composer.json 中的 archive 配置(如 exclude、format),然后基于当前工作目录打包,完全不解析或包含 vendor/ 下的依赖。即使你刚执行过 composer install,vendor/ 也不会被纳入归档范围。
-
composer archive默认排除vendor/、.git/、composer.lock等(除非显式配置include) - 它不检查依赖是否已安装,也不下载或复制任何包文件
- 生成的 zip 里只有你项目源码,运行时仍需
composer install
真正能打包依赖的替代方案
要得到含全部依赖的可部署 zip(即“带 vendor 的完整包”),得绕过 composer archive,改用文件系统级打包:
- 先确保
vendor/已存在:composer install --no-dev --optimize-autoloader - 用系统命令打包(Linux/macOS):
zip -r deploy.zip . -x "node_modules/*" -x ".git/*" -x "tests/*" - Windows 用户可用
7z a -tzip deploy.zip * -xr!node_modules -xr!.git -xr!tests - 若需自动化,可在
composer.json的scripts里加一条 shell 调用
注意 composer install 的参数影响结果
打包前运行的 composer install 必须带对参数,否则 zip 会漏依赖或含多余内容:
-
--no-dev:必须加,否则 dev-only 包(如phpunit)也会进vendor/ -
--optimize-autoloader:生成vendor/autoload.php的优化映射,提升生产环境性能 - 不要用
--ignore-platform-reqs,除非你明确知道目标环境缺失扩展但能容忍 -
composer.lock必须存在且与composer.json同步,否则install结果不可重现
真正麻烦的不是打包动作本身,而是保证 vendor/ 内容与线上环境 PHP 版本、扩展、平台要求完全一致——这一步没做对,zip 解压后直接 Class not found 或 require(): Failed opening required。










