第三方SDK包体积大并非因代码多,而是打包了全功能链路,包括iOS/Android桥接文件、示例工程、调试工具、多语言文案、冗余HTTP客户端及mock server等;如阿里云、AWS、腾讯云SDK单个vendor目录常达30–80MB,其中tests/、examples/、resources/等非运行时文件占比超60%。

第三方SDK包为什么特别占体积?
不是因为代码多,而是 SDK 通常打包了全功能链路:iOS/Android 原生桥接文件、示例工程、本地调试工具、多语言文案、冗余的 HTTP 客户端(比如自带 Guzzle + cURL + HTTPlug)、甚至整套 mock server。像 alibabacloud/pop-core、aws/aws-sdk-php、tencentcloud/tencentcloud-sdk-php 这类包,vendor 下单个目录动辄 30–80 MB,其中 tests/、examples/、resources/、bin/ 占比常超 60%。
如何安全删掉 SDK 包里的非运行时文件?
别直接 rm -rf vendor/*sdk*/tests——有些 SDK 把 Handler 类或配置模板放在 tests/ 里(如旧版 aliyun-openapi-php-sdk),删了就 Class not found。真正安全的做法是源头过滤:
- 确认该 SDK 来自 Packagist(即走 dist zip 下载),才能用
archive.excludes - 在
composer.json的config.archive.excludes中加这几项:"/tests/"、"/examples/"、"/demo/"、"/resources/lang/"、"/.github/"、"/CHANGELOG.md" - 必须先装插件:
composer require --dev composer-archive-excludes - 改完后跑
composer update --lock再composer install --no-dev,否则旧 lock 文件会跳过 exclude 逻辑
SDK 的可选依赖怎么精准剔除?
很多 SDK 在 suggests 或 require 里声明了“可选但默认装”的组件,比如 aws/aws-sdk-php 默认拉 guzzlehttp/psr7 + ralouphie/getallheaders + phpseclib/phpseclib,而你只用 S3 就只需要前者;tencentcloud/tencentcloud-sdk-php 默认含 firebase/php-jwt,但你走密钥对鉴权就用不上。
实操建议:
- 先查它带哪些可选依赖:
composer show tencentcloud/tencentcloud-sdk-php | grep suggests - 若确认某依赖完全不用,用
conflict显式拦截:"conflict": {"firebase/php-jwt": "*"} - 注意:部分 SDK(如新版
google/apiclient)用provide声明 JWT 能力,conflict无效,得配"replace": {"firebase/php-jwt": "999.0.0"}占位 - 执行
composer update --with-dependencies触发重新解析,避免残留
SDK 的 autoload 配置怎么防膨胀?
某些 SDK 的 composer.json 里写了 "autoload": {"psr-4": {"TencentCloud\": "src/"}},但 src/ 下混着 tests/ 和 examples/ 子目录——结果 composer dump-autoload -o 会把整个 src/ 扫进 classmap,哪怕你只用 TencentCloudCvmV20170312CvmClient。
解决办法只有两个:
- 用
composer show tencentcloud/tencentcloud-sdk-php看它的 autoload 定义,如果发现路径太宽,优先提 PR 请上游拆分;临时方案是 fork 后删掉 src/tests/ 等目录再发布私有版 - 项目级兜底:
composer dump-autoload --classmap-authoritative --no-dev,强制 autoloader 只认vendor/composer/autoload_classmap.php,彻底绕过 scandir 扫描——这步不减体积,但让前面所有裁剪真正生效
最常被忽略的是:SDK 更新后 archive.excludes 可能失效(新版本 zip 结构变了),每次升级 SDK 后务必重跑 du -sh vendor/tencentcloud* | sort -hr 快速验证是否还有 tests/examples 落地。











