Composer本身不支持直接导出ZIP,必须用composer install --no-dev --prefer-dist清理依赖后,再用系统命令(如zip或tar)手动打包vendor目录,且须确保PHP环境、扩展及路径权限一致。

Composer 本身不支持直接导出 ZIP,必须用 composer install --no-dev --prefer-dist + 手动打包
Composer 没有内置命令能把 vendor/ 打成 ZIP。很多人误以为 composer archive 或第三方插件能一键搞定,但官方早已废弃 archive 命令(自 Composer 2.0 起移除),且所有“自动打包”插件都不可靠、不维护、易出错。
真正稳定的做法是:先确保依赖已干净安装,再用系统命令压缩整个 vendor/ 目录。关键前提是——必须用 --prefer-dist,否则会下载源码包(含 .git 文件)、体积大、结构乱,ZIP 后解压可能失败。
-
composer install --no-dev --prefer-dist:跳过开发依赖,强制走 dist 包(通常是 tar.gz),体积小、无冗余元数据 - 确认
vendor/下每个包都是扁平目录(不含 .git、.github、tests 等),可用find vendor -name ".git" | head -n1快速检查 - Windows 用户注意:PowerShell 的
Compress-Archive对长路径和特殊字符支持差,建议改用 7-Zip 或tar -czf(Git Bash/WSL)
离线部署时,vendor/ ZIP 解压后必须保留完整目录结构和文件权限
把 ZIP 拷到目标机器后,不能直接 unzip vendor.zip 到任意位置——解压路径必须是项目根目录下的 vendor/,且不能覆盖已有 composer.lock。否则 composer install 会重新拉包,失去离线意义。
- 正确操作:
rm -rf vendor && unzip vendor.zip -d ./(Linux/macOS)或tar -xzf vendor.tar.gz(更推荐,保留权限) - Windows 上若用资源管理器解压,.htaccess、空目录、软链接会丢失,务必用命令行工具(如 7-Zip CLI 或 WSL)
- 验证是否成功:
composer dump-autoload --classmap-authoritative应无报错;php -r "require 'vendor/autoload.php'; echo 'OK';"能执行
composer install --ignore-platform-reqs 在离线环境常被忽略,但 PHP 扩展兼容性必须提前对齐
ZIP 包里装的是编译好的 dist 文件,但运行时仍要满足平台约束(如 ext-gd、php >=8.1)。如果目标服务器 PHP 版本或扩展缺失,解压完也跑不起来——这不是 ZIP 的问题,而是镜像前没做兼容性检查。
- 打包前,在与目标环境一致的 Docker 容器中执行
composer install --no-dev --prefer-dist --ignore-platform-reqs,再打包,可绕过本地环境限制 - 但上线前必须手动确认:
php -m | grep gd、php -v,否则Fatal error: Class 'Imagick' not found这类错误只能现场排查 - 若项目用了
platform配置(composer.json中的"platform": {"php": "8.1.0"}),离线部署时该配置无效,实际运行仍以服务器 PHP 版本为准
想建私有离线镜像?别用 ZIP,改用 composer config repo.packagist false + path 仓库
为多个项目反复传 ZIP 很麻烦。真要长期离线,应该搭建本地镜像源,而不是每次打包 ZIP。Composer 支持 path 类型仓库,即把已下载的包目录当作源,无需 HTTP 服务。
- 先用
composer install --no-dev --prefer-dist下好所有包 → 复制整个vendor/到共享目录(如/mnt/mirror/) - 在项目中运行:
composer config repositories.offline '{"type":"package","packages":[]}' && composer config repos.offline.type path && composer config repos.offline.url "/mnt/mirror" - 后续执行
composer install会直接从本地路径读取包,比解压 ZIP 更可靠,还能增量更新 - 注意:
path仓库不支持dev-master等分支别名,所有包必须有明确版本号(来自composer.lock)
离线场景下,ZIP 只是临时搬运工,真正容易翻车的是权限、平台约束、路径一致性——这些没法靠一条命令修复,得在打包前就盯住。











