
源生成器有助于开发者重新思考使用反射的方法,转而使用编译时技术避免昂贵操作的运行时开销。.NET 团队于 2020 年 4 月 29 日向社区推出了源生成器,采用这种新方法,可以通过 Roslyn 检查项目代码并生成新的 C# 源文件向项目添加新功能。
虽然源生成器的优点显而易见,但其使用或构建可能会较为复杂。好在 JetBrains Rider 解决了这些问题,使用它可以查看任意源生成器的输出、调试生成的工件,以及调试源生成器本身。
这些技术都有助于梳理源生成流程,并让您成为更自信的开发者。接下来,我们就一起看看这些功能。
继续阅读前,您可以克隆我的示例源生成器项目。
源生成器文件
引用源生成器时,源生成是在引用项目的编译过程中发生,明白这一点非常重要。在 JetBrains Rider 的 UI 中,导航到项目的 Dependencies(依赖项)节点就可以看到。

项目中引用的每个源生成器和所有 C# 源生成的工件都有一个群组。

调试源生成的文件
虽然查看源生成的输出有助于调试问题,但步入代码本身显然更为直接。使用 Rider 的调试器可以随时调查任何源生成的代码。首先,向使用生成的工件的代码添加断点,然后使用快捷键 Step Into(步入)即可逐步执行代码。
如果您熟悉 JetBrains Rider 调试器,现在就可以执行所有常规调试任务。
调试源生成器
我们最近增加了对调试源生成器本身的支持。运行源生成器需要一个上下文,这个上下文是项目。在源生成器项目中,需要使用 launchSettings.json 文件开始源生成器调试。这个文件通常位于 Properties 文件夹中。文件内容将类似于:
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"Generators": {
"commandName": "DebugRoslynComponent",
"targetProject": "../ConsoleTest/ConsoleTest.csproj"
}
}
}
这个启动设置的关键部分是 DebugRoslynComponent
的 commandName
值。您还需要指定一个项目,用作源生成流程的上下文。完成这个文件后,即可使用装订区域中的 Play(运行)按钮开始调试流程。

从这里,您可以在源生成器代码中设置断点并查看源生成期间使用的上下文。

特别注意:对于调试,JetBrains Rider 2023.1 目前支持 4.3.1 版本的 Microsoft.CodeAnalysis.Csharp
和 Microsoft.Net.Compilers.Toolset
软件包。因此,如果出现无法调试源生成器的情况,您的软件包版本可能较高。
快照测试
如果您正在寻找测试源生成器的其他方法,请查看 Andrew Lock 关于将 Verify 用于快照测试的文章。
快照测试会运行测试并将输出与已知输出进行比较。当然,其作用不止于此,但是将测试输出与已知且经过验证的先前输出进行比较,是确保源生成器按期望发出代码的绝佳方法。
另外,还请尝试一下 Matthias Koch 的 Verify 插件,它将一流的 Verify 体验引入 JetBrains Rider。
JetBrains Rider 2023.2
Roslyn 模板
虽然可能许多人都已经拥有一套自定义源生成器,但我们也知道 .NET 社区还有很大一部分对源生成器犹豫不决。因此,在 JetBrains Rider 2023.2 中,我们发布了两个新的 JetBrains 模板:Roslyn 分析器和源生成器。

使用这些模板,您可以从预配置的解决方案开始,该解决方案提供了核心项目、用于运行源生成器的示例目标项目,以及用于快速断言工作的单元测试项目。我们的目标是简化编写源生成器的入门流程,并让您预先获得更多价值。
如果您已经拥有一套源生成器项目,那么这些模板也可以作为参考,用来调整解决方案,使其与 JetBrains Rider 的调试体验更为协调。
结论
对于许多人来说,使用源生成器已经足够复杂,因此通过工具支持来更好地理解生成器非常宝贵。如果先前源生成器让您感觉有些可怕,我希望本文对工具支持的概述能带给您尝试的勇气。
本博文英文原作者:Khalid Abuhakmeh

Rider 相关阅读

⏬ 戳「阅读原文」了解更多
本文分享自微信公众号 - JetBrains(JetBrainsChina)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。