根本原因是Composer默认保留开发冗余文件;需用--no-dev、--prefer-dist、archive.excludes插件源头过滤tests/docs等,配合--optimize-autoloader与--classmap-authoritative生效,并重建vendor确保缓存复用。

Composer 中文安装包体积大,根本原因不是“中文”本身,而是项目中混入了大量开发期依赖、未声明的软依赖、历史残留的 vendor 文件,以及未启用压缩机制的下载行为。
为什么 composer install 后 vendor 动辄 200MB+?
常见现象:执行 composer install 后,vendor 目录远超预期——尤其在引入 overtrue/wechat、topthink/think-orm 或某些带完整文档/测试/示例的 SDK 时。这不是 Composer 下载了“中文包”,而是这些包把 .git、tests/、docs/、examples/、CHANGELOG.md 全部打进发布包(尤其是通过 dist 方式安装时,GitHub Release ZIP 包未做裁剪)。
-
composer.json中未设置"prefer-dist": true,导致 fallback 到体积更大的source模式(含 .git) - 包作者未在
composer.json的archive.excludes字段排除非运行必需文件 - 本地
vendor曾用dev-master或@dev安装过,残留大量开发分支文件
执行 composer install --no-dev --optimize-autoloader 前必须确认三件事
这条命令能砍掉 30%~60% 体积,但前提是环境和配置已就绪,否则可能白忙活:
- 确保
composer.json的require-dev里只放真正需要的开发工具(如phpunit/phpunit),删掉长期不用的barryvdh/laravel-debugbar等调试包 - 检查
autoload-dev是否误将生产环境代码路径写进开发自动加载(会导致--no-dev仍保留冗余类) - 确认项目不依赖
symfony/var-dumper或monolog/monolog的 dev-only 特性(例如某些日志处理器仅在dev环境注册)
执行后,vendor/composer/autoload_classmap.php 会变小,vendor/autoload.php 不再加载 tests/ 下的类——这是体积下降的核心机制。
用 composer-unused 扫出“假装有用”的依赖
很多包被 require 进来后,实际一行代码都没调用过,却一直躺在 vendor 里占空间。手动排查几乎不可能,得靠静态分析工具:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 安装:
composer global require composer-unused/composer-unused - 运行:
composer-unused --no-progress --json(加--json可导出结果供脚本处理) - 重点关注输出中标记为
unused且无class usage或function usage的包(如guzzlehttp/psr7被firebase/php-jwt间接依赖,但你没直接用它——这时不能删)
注意:composer-unused 无法识别运行时动态加载(如 class_exists("Foo\Bar"))、配置驱动的依赖(如 Laravel Service Provider 中注册但未触发的类),这类要人工核对。
彻底清理:删 vendor + 清 Composer 缓存 + 强制重装
最干净的做法不是“优化”,而是重建。尤其当你发现 vendor 里有 .github/、.idea/、甚至 node_modules/(某些 PHP 包错误地把前端构建产物打包进 dist)时:
- 删整个
vendor:rm -rf vendor/(Windows 用rmdir /s vendor) - 清缓存:
composer clear-cache(否则 Composer 可能复用旧的、未裁剪的 ZIP 包) - 强制走 dist + 跳过 dev + 优化自动加载:
composer install --no-dev --optimize-autoloader --prefer-dist
如果某包死活不肯走 dist(比如提示 Failed to download xxx, package is not available),说明它没打 GitHub Release,只能临时加 --prefer-source,但之后应向包作者提 PR 补上 archive.excludes 配置。
真正难的不是命令怎么敲,而是分辨哪些“看起来有用”的依赖其实从未被执行;还有那些藏在 autoload 配置里的隐式引用,会让 composer-unused 完全失明。

















