使用Composer Scripts为依赖进行瘦身
常见的 SDK 都会将所有功能都集成在一个代码库中,本文以腾讯云开发者工具套件(SDK)3.0 为例。
tencentcloud-sdk-php
在 GitHub 的地址是:https://github.com/TencentCloud/tencentcloud-sdk-php
通过执行:
composer require tencentcloud/tencentcloud-sdk-php
来安装完整的 SDK 依赖,而如果只想安装某个产品的,可以使用
composer require tencentcloud/产品名
例如:composer require tencentcloud/cvm
至于具体支持什么产品,可以看到src/TencentCloud
目录下有很多的文件夹,包含了对应的产品名,或者直接去 tencentcloud-sdk-php
[1] 查找。
我在为 WordPress 的腾讯云对象存储插件 [2]增加数据监控的时候用到了云产品监控的 SDK [3]
composer require tencentcloud/monitor
但是只需要用到其中的几个文件,大部分都是无用的,徒增了插件的大小,所以研究了一下将它移除掉,只留下有需要的文件。
在 composer.json
中增加了如下代码:
"scripts": { "post-install-cmd": "SyncQcloudCos\\Composer::removeUnusedModels", "post-update-cmd": "SyncQcloudCos\\Composer::removeUnusedModels" }, "extra": { "tencentcloud/monitor": [ "GetMonitorDataRequest.php", "Instance.php", "Dimension.php", "GetMonitorDataResponse.php", "DataPoint.php" ]
}
基于 composer
的事件,在执行install
和update
时通过removeUnusedModels
方法,获取到extra
中需要保留的文件,执行删除其他文件的操作。
删除完成后,重新生成一下 classmap
,否则classmap
里可能还会存在对应的文件信息。
为什么 Composer 在生产环境要使用 dumpautoload? [4]
最后实现代码如下:
namespace SyncQcloudCos; use Composer\Script\Event; class Composer { public static function removeUnusedModels(Event $event) {
$composer = $event->getComposer();
$extra = $composer->getPackage()->getExtra();
$listedModels = $extra['tencentcloud/monitor'] ?? []; if ($listedModels) {
$vendorPath = $composer->getConfig()->get('vendor-dir');
$dir = "{$vendorPath}/tencentcloud/monitor/src/TencentCloud/Monitor/V20180724/Models";
$files = scandir($dir); foreach ($files as $file) { if ($file === '.' || $file === '..') { continue;
} if (!in_array($file, $listedModels)) {
unlink("{$dir}/{$file}");
}
}
$generator = $composer->getAutoloadGenerator();
$generator->dump($composer->getConfig(), $composer->getRepositoryManager()->getLocalRepository(), $composer->getPackage(), $composer->getInstallationManager(), 'composer', true);
}
}
}
Composer Scripts 用途还有很多,对于在 Composer 执行过程中执行包的自定义代码或特定于包的命令非常有用。详细的内容可以查看官方文档 [5]。