常见的 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 查找。
我在为 WordPress 的腾讯云对象存储插件增加数据监控的时候用到了云产品监控的 SDK
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?
最后实现代码如下:
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 执行过程中执行包的自定义代码或特定于包的命令非常有用。详细的内容可以查看官方文档。
发表评论
沙发空缺中,还不快抢~