我将如何根据 Google API 生成代码?

How would I generate code based on the Google API?

总结与问题

我希望在 C# 中生成代码以防止大量重复,并按照他们自己的方式包装 Google API,如他们的 .Net Client library page. Edit: Their generator 所述显然是用 Python 写的。我将继续研究其他 .Net 选项。

我应该关注哪里,CodeDOM、Roslyn 还是其他?我是否应该根本不考虑代码生成 - 如果是的话,我应该采取什么替代途径来正确处理这种情况?

详情

我正在为 Google .Net API 编写一个包装器,以便为 PowerShell 创建一个 Google API 库(对于所有 Google APIs)。我已经在其中三个 API 上工作了,但是由于我的项目处理所有身份验证(及其存储)和分页等其他事情,所以我基本上必须将每个 API 方法调用包装到使用我自己的身份验证,这样用户就不必担心了。这就导致了.Net库中已经存在的大量重复编码封装方法:

public Data.Asp Get(string userKey, int codeId)
{
    //I have to wrap their get method with my own using GetService(), for example
    return GetService().Asps.Get(userKey, codeId).Execute();
}

由于这一切都是基于通过 Google Discovery API 或通过底层客户端库存在的信息,我觉得应该有某种方法来生成代码并为我省去一些麻烦。

一些背景和相关信息

Google API .Net Client 库的主页上指出:

The source code for the individual Google APIs is programmatically generated using the Discovery API.

我想做类似的事情,虽然我不知道我的时间和研究应该花在哪里。我查过 CodeDOM (and the inherent limitations), Roslyn as well as some differences between the two. I've also checked out the T4 Text Templates for Visual Studio

需要说明的是,我希望在运行时生成代码,就像使用反射之类的东西一样,我希望生成一些库——尽管我不确定我是否正在寻找 active or passive 代。

我在 Google 工作,负责 .NET 客户端库(除其他外)。您的问题影响深远,但大致思路如下:

用于描述 "most" Google API 的元数据是通过 发现文档 获得的。这描述了 API 的方法和类型。

用于访问 Google 的 API 的客户端库是从 Python 库生成的,正如您指出的那样。 (特别是使用 Django 作为模板语言。)

为每个 Google API 生成代码后,我们调用 MSBuild,打包二进制文件,并将它们部署到 NuGet。

至于你关于如何生成代码的具体问题,我建议你构建两个单独的组件。第一个是将读取和解析发现文档的东西,第二个是将发出代码的组件。

对于实际的代码生成,这里有一些个人的看法:

  • 最简单的做法是使用 text-based 模板语言。 (例如 Django 或自己编写。)
  • CodeDOM 是一个有趣的选择,但可能比您想要的要难用得多。这就是 Visual Studio 的一些代码生成方式,例如您描述代码,CodeDOM 将发出 C#、VB、MC++ 以满足您的需求。但是,由于您只专注于 C#,CodeDOM 支持多种语言的好处就没有用了。
  • Roslyn 确实是一项很酷的新技术,但可能用处不大。我相信 Roslyn 具有动态建模代码和 round-trip AST 到磁盘的能力。但这可能有点矫枉过正,因为您不是在尝试构建 general-purpose C# codegen 解决方案,而只是针对生成与 API 发现文档相匹配的代码。

所以我现在建议一个基本的 text-based 解决方案,看看它能帮助你走多远。如果您有任何其他问题,请随时给我发消息或在 GitHub issue tracker.

上记录问题