镜像源不裁剪vendor冗余文件,仅改变下载地址和速度;vendor体积大需通过--no-dev、--prefer-dist、archive.excludes插件及post-install-cmd脚本在本地解压阶段按需过滤tests/docs/lang等非运行文件。

镜像源本身不参与 vendor 冗余处理,换中文镜像不会自动删 tests/docs/,也不会影响包内文件结构——它只改下载地址和速度。
composer config --global repo.packagist 配了中文镜像但 vendor 还是很大
这是最常被误解的点:镜像源(如 https://packagist.phpcomposer.com 或 https://mirrors.aliyun.com/composer/)只是把原本从 packagist.org 下载的 ZIP 包,换成从国内服务器拉取。ZIP 包内容完全由包作者决定,Composer 不会在传输中做任何裁剪。
- 如果
overtrue/wechat的 dist ZIP 里自带tests/和docs/,换镜像后照样全量解压 - 如果
laravel/framework打包时没设archive.excludes,中文镜像下载的 ZIP 依然含 40+ 种语言目录 - 执行
composer install --no-dev后 vendor 仍超 300MB?问题不在镜像,而在包自身或本地配置未生效
换镜像后 vendor 出现“残留”其实是状态未同步
常见现象是:删了 require 里的包,composer remove foo/bar 成功,但 ls vendor/foo 还在,甚至 composer show foo/bar 仍返回版本号。这不是镜像导致的,而是四层状态没对齐:
-
vendor/目录:物理文件未删(remove失败或中断) -
vendor/composer/autoload_*.php:映射条目还在,PHP 仍会尝试加载 - OPcache 缓存:
opcache_reset()没调用,旧映射还在内存里 - Composer 本地缓存:
~/.composer/cache/里可能存着旧 ZIP 快照,下次 install 会复用
解决方法不是换镜像,而是执行:rm -rf vendor && composer install --no-dev --prefer-dist --remove-vcs && composer dump-autoload --classmap-authoritative -o,再手动调用 opcache_reset()。
真正能裁剪 vendor 中文冗余的配置项都在 composer.json 里
要让中文语言包、文档、测试目录不落地,必须靠项目级声明,而非镜像源。关键配置有三个层级:
-
"config": {"preferred-install": "dist", "sort-packages": true}:强制走 ZIP 安装,跳过 git clone 带来的.git -
"config": {"archive": {"excludes": ["/tests/", "/docs/", "/lang/!(zh|en)/", "/resources/lang/!(zh-CN)/"]}}:需先composer require --dev composer-archive-excludes,否则无效 -
"scripts": {"post-install-cmd": ["@php -r \"array_map('unlink', glob('vendor/**/lang/!(zh|en)', GLOB_ONLYDIR));\""]}:作为兜底,清理 archive.excludes 漏掉的路径(注意部分系统不支持!(zh)语法)
这些配置写进 composer.json 后,无论你用阿里云镜像还是腾讯云镜像,效果都一样。镜像只管“从哪下”,裁剪逻辑全在本地解析和解压阶段。
中文镜像 + vendor 裁剪失败的典型组合坑
很多团队踩坑是因为把两件事混在一起操作,结果互相干扰:
- 刚切完中文镜像就立刻
composer update:lock 文件 hash 可能因新镜像返回不同 URL 而失效,触发意外升级,间接依赖变多,反而增大 vendor - 配了
archive.excludes却没装composer-archive-excludes插件:配置被完全忽略,tests/ 照样解压 - 在 Windows 上用中文路径 + 中文镜像:PHP 底层 realpath() 对 UTF-8 路径处理不稳定,报
failed to open stream,误以为是镜像问题 - CI 流水线里用了
--prefer-dist,但 runner 环境没开allow_url_fopen:退化成 source 模式,.git全部保留
最稳的操作链是:先确保路径全英文 → 清空 ~/.composer/cache → rm -rf vendor composer.lock → composer install --no-dev --prefer-dist --remove-vcs → 补插件 + 配 archive.excludes → 最后跑一次 composer dump-autoload -o。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











