镜像配置不影响 vendor 压缩行为,仅加速 zip 包下载;vendor 体积由 --prefer-dist、--no-dev、autoload 优化及 archive.excludes 等参数决定,语言包裁剪需 post-install-cmd 或专用工具,docker 多阶段构建才是终极压缩方案。

镜像配置不改变 vendor 压缩行为,只影响 ZIP 包来源
Composer 镜像(如阿里云、腾讯云)本身不参与 vendor 目录的“打包”或“压缩”,它只代理下载请求——你看到的 vendor/monolog/monolog/ 下的文件,是 Composer 从镜像 URL 下载的 ZIP 包解压所得,而非镜像服务器生成或重压缩的。镜像的作用仅限于:packages.json、p2/monolog/monolog.json 和 dist ZIP 包这三类响应体的传输加速与缓存代理。
也就是说,如果你用的是 https://mirrors.aliyun.com/composer/,Composer 实际发起的请求类似:GET https://mirrors.aliyun.com/composer/dist/monolog/monolog/2.13.0/monolog-monolog-2.13.0-zip-9a8b7c.zip。这个 ZIP 文件由 Packagist 原始构建并上传,镜像只是原样同步、原样分发。它的压缩格式(ZIP)、压缩级别(Deflate)、是否含符号链接,完全取决于包发布者上传时的设置,镜像不会改写或二次压缩。
- 镜像未开启 Gzip/Brotli 响应压缩?
curl -I https://mirrors.aliyun.com/composer/packages.json看不到Content-Encoding: gzip——这只会拖慢元数据加载,不影响 ZIP 包内容 - 镜像同步延迟导致拉到旧版 ZIP?可能,但不是“压缩逻辑变更”,而是版本滞后
- 你本地
composer install --prefer-dist拉下来的 ZIP 解压后体积大?问题在包本身,不在镜像
真正影响 vendor 体积的,是安装参数和 autoload 配置
vendor 目录大小几乎和镜像无关,而由以下几项直接决定:
-
--prefer-dist:强制走 ZIP 下载(而非 git clone),避免 .git 目录残留;没加它,某些包可能因本地有 .git 或配置了"preferred-install": "source"而走源码模式,体积翻倍 -
--no-dev:跳过require-dev中的包(如 phpunit、phpstan),但不删已装包里的 tests/ 目录 -
--optimize-autoloader+--classmap-authoritative:生成扁平 classmap,让 autoloader 不再扫描整个vendor/,但不删文件 -
config.archive.excludes:指定要从 dist ZIP 中排除的路径(如"/tests/"、"/docs/"),需搭配插件composer-archive-excludes才生效
例如,symfony/console 默认 ZIP 含完整命令行交互逻辑和大量示例,加 "archive.excludes": ["/Resources/"] 并运行 composer update --lock,才能在下次 install 时真正跳过这些目录。
中文语言包裁剪必须靠 post-install-cmd 或专用工具
很多包(如 laravel/framework、spatie/laravel-translatable)把几十种语言翻译打进了 dist ZIP,镜像无法过滤——它只负责把原始 ZIP 完整传给你。想只留 zh-CN,必须在解压后主动清理:
- 简单粗暴:在
composer.json的scripts里加post-install-cmd,用 PHPglob()扫描删非中文 lang 目录,但注意glob('vendor/**/lang/!(zh*)', GLOB_ONLYDIR)在部分系统不支持扩展 glob - 更稳:装
janoside/composer-cleaner,配白名单"zh", "en",它能处理resources/lang/、locale/、translations/多种路径 - CI/CD 中别依赖手动删:清理逻辑必须固化进
composer.json或构建脚本,否则每次composer install都恢复原状
注意:archive.excludes 对这类语言包无效——它只在下载 ZIP 时起作用,而语言目录往往在 ZIP 根层,不是子路径,排除规则匹配不上。
多阶段 Docker 构建才是 vendor 压缩的终极解法
所谓“vendor 压缩”,本质是减少最终交付产物体积。镜像配置、--prefer-dist、archive.excludes 都只是前置优化,真正起效的是构建阶段的裁剪:
- builder 阶段用
php:8.3-cli-alpine,执行:composer install --no-dev --prefer-dist --optimize-autoloader --classmap-authoritative - runtime 阶段用
php:8.3-fpm-alpine,只COPY --from=builder /app/vendor /var/www/html/vendor - 加一层
find vendor/ -name ".git" -type d -exec rm -rf {} +清掉所有残留 .git - 禁止
COPY --from=builder /app .——否则把 composer.lock、.env、tests/ 全拖进 runtime 镜像
这里的关键不是“压缩 ZIP”,而是让最终镜像里只有 vendor/autoload.php、vendor/composer/ 和实际 require 的类文件。其他一切——文档、测试、CHANGELOG、.github、.gitattributes——都该在 builder 阶段末尾被物理删除,而不是指望镜像替你做。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











