.NET Tools

在 JetBrains Rider 中调试源生成器

Read this post in other languages:

源生成器有助于开发者重新思考使用反射的方法,转而使用编译时技术避免昂贵操作的运行时开销。 .NET 团队于 2020 年 4 月 29 日向社区推出了源生成器,采用这种新方法,可以通过 Roslyn 检查项目代码并生成新的 C# 源文件向项目添加新功能。

虽然源生成器的优点显而易见,但其使用或构建可能会较为复杂。 好在 JetBrains Rider 解决了这些问题,使用它可以查看任意源生成器的输出、调试生成的工件,以及调试源生成器本身。 

这些技术都有助于梳理源生成流程,并让您成为更自信的开发者。 接下来,我们就一起看看这些功能。

继续阅读前,您可以克隆我的示例源生成器项目

源生成器文件

引用源生成器时,源生成是在引用项目的编译过程中发生,明白这一点非常重要。 在 JetBrains Rider 的 UI 中,导航到项目的 Dependencies(依赖项)节点就可以看到。

显示依赖项下的源生成器节点的解决方案资源管理器

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

在 JetBrains Rider 中查看源生成的代码

调试源生成的文件

虽然查看源生成的输出有助于调试问题,但步入代码本身显然更为直接。 使用 Rider 的调试器可以随时调查任何源生成的代码。 首先,向使用生成的工件的代码添加断点,然后使用快捷键 Step Into(步入)即可逐步执行代码。

如果您熟悉 JetBrains Rider 调试器,现在就可以执行所有常规调试任务。

调试源生成器

我们最近增加了对调试源生成器本身的支持。 运行源生成器需要一个上下文,这个上下文是项目。 在源生成器项目中,需要使用 launchSettings.json 文件开始源生成器调试。 这个文件通常位于 Properties 文件夹中。 文件内容将类似于:

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "profiles": {
    "Generators": {
      "commandName": "DebugRoslynComponent",
      "targetProject": "../ConsoleTest/ConsoleTest.csproj"
    }
  }
}

这个启动设置的关键部分是 DebugRoslynComponentcommandName 值。 您还需要指定一个项目,用作源生成流程的上下文。 完成这个文件后,即可使用装订区域中的 Play(运行)按钮开始调试流程。

在源生成器上运行调试进程

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

特别注意:对于调试,JetBrains Rider 2023.1 目前支持 4.3.1 版本的 Microsoft.CodeAnalysis.CsharpMicrosoft.Net.Compilers.Toolset 软件包。因此,如果出现无法调试源生成器的情况,您的软件包版本可能较高。

快照测试

如果您正在寻找测试源生成器的其他方法,请查看 Andrew Lock 关于将 Verify 用于快照测试的文章。 

快照测试会运行测试并将输出与已知输出进行比较。 当然,其作用不止于此,但是将测试输出与已知且经过验证的先前输出进行比较,是确保源生成器按期望发出代码的绝佳方法。

另外,还请尝试一下 Matthias Koch 的 Verify 插件,它将一流的 Verify 体验引入 JetBrains Rider。

JetBrains Rider 2023.2 Roslyn 模板

虽然可能许多人都已经拥有一套自定义源生成器,但我们也知道 .NET 社区还有很大一部分对源生成器犹豫不决。 因此,在 JetBrains Rider 2023.2 中,我们将发布两个新的 JetBrains 模板:Roslyn 分析器源生成器

显示 Roslyn 部分以及分析器和源生成器新模板的 New Solution(新建解决方案)屏幕。

使用这些模板,您可以从预配置的解决方案开始,该解决方案提供了核心项目、用于运行源生成器的示例目标项目,以及用于快速断言工作的单元测试项目。 我们的目标是简化编写源生成器的入门流程,并让您预先获得更多价值。

如果您已经拥有一套源生成器项目,那么这些模板也可以作为参考,用来调整解决方案,使其与 JetBrains Rider 的调试体验更为协调。

结论

对于许多人来说,使用源生成器已经足够复杂,因此通过工具支持来更好地理解生成器非常宝贵。 如果先前源生成器让您感觉有些可怕,我希望本文对工具支持的概述能带给您尝试的勇气。

一如既往,希望您喜欢这篇文章,并在下方评论区留言。

图片来源:Denny Müller

本博文英文原作者:

Sue

Khalid Abuhakmeh

image description

Discover more