探索Cake插件:AzureCLI的C#集成

在现代软件开发中,云服务的管理和自动化部署变得日益重要。Azure CLI 提供了一种强大的方式来管理 Azure 资源,但如何将其与C#项目无缝集成,一直是开发者面临的挑战。最近,一个名为 Cake.AzureCli 的 Cake 插件的发布,为提供了一个解决方案。本文将介绍这个插件是什么,如何使用它,以及它是如何被构建的。

什么是Cake.AzureCli插件?

Cake.AzureCli 是一个 Cake 插件,它允许开发者在C#项目中直接使用 Azure CLI 命令。这意味着可以享受到强类型、跨平台依赖管理的好处,并且拥有完整的 IntelliSense 支持,包括示例。

如何使用Cake.AzureCli插件?

要使用 Cake.AzureCli,首先需要了解 Cake 是什么。Cake 是一个基于C#依赖管理工具,类似于 make、ant、maven 或 rake。它拥有一个庞大的插件生态系统,而 Cake.AzureCli 的加入使得这个生态系统更加丰富。

使用 Cake.AzureCli 非常简单,只需要在项目中添加一个预处理器指令来从 NuGet 获取它:

#addin "nuget:?package=Cake.AzureCli&version=1.2.0"

然后,就可以像这样访问命令:

Az()

下面是一个简单的程序,用于登录并列出所有的资源组:

var target = Argument("target", "Default"); var username = Argument<string>("username", null); var password = Argument<string>("password", null); Task("Login").Does(() => { Az().Login(new AzLoginSettings { Username = username, Arguments = new ProcessArgumentBuilder() .Append("--password").AppendSecret(password) }); }); Task("ListResourceGroups").IsDependentOn("Login").Does(() => { Information("Resource Groups:"); dynamic allResourceGroups = Az().Group.List(new AzGroupListSettings()); foreach (var resourceGroup in allResourceGroups) { Information(resourceGroup.name); } }); RunTarget(target);

通过这种方式,可以轻松地创建 SQL 实例、调整 Kubernetes 集群的规模,以及使用依赖管理来配置虚拟机。

构建Cake.AzureCli插件的过程

构建这样一个大型插件显然不能手工完成,而且当 Azure 团队发布新版本时,它还需要容易更新。因此,代码生成成为了解决方案。作者一直想学习 T4 模板,这也是构建过程的一部分。

首先,作者设计了一个数据结构,这是一个很好的起点。这个数据结构不仅支持 Azure CLI,还可以通用地表示任何 CLI 工具。作者构思了一个程序包含单个根组(az),组可以递归地包含其他组(例如,az 包含 az aks,后者又包含 az aks nodepool)。组可以包含命令(例如,az aks 包含 az aks create)。为了文档化,命令可以有示例和参数。

这基本上是一个树形结构,命令作为叶子节点,非常适合 JSON 格式。但是如何填充它呢?

作者执行了数千个 az [thing] --help 命令并解析结果。每个 "xyz --help" 被解析成一个中间对象:一个 Page。这基本上只是一个标题、名称-值对和段落的集合。然后,将页面转换为组或命令,并递归地产生一个包含 350,385 行、15 兆字节的庞然大物。

T4 模板的使用也非常有趣。虽然每次保存或在 .tt 文件中按下 Tab 键时,生成 178 万行代码需要 13 秒(即使在拥有 8 核 i9、64GB 内存和 SSD 的电脑上),但它们确实有效。

生成的内容也很有趣。暴露一个方法给 Cake 很简单,只需要编写一个扩展方法:

public static class AzAliases { [CakeMethodAlias] public static AzCliGroup Az(this ICakeContext context) { return new AzCliGroup(context); } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485