.NET Tools
Essential productivity kit for .NET and game developers
在 JetBrains Rider 中调试源生成器
源生成器有助于开发者重新思考使用反射的方法,转而使用编译时技术避免昂贵操作的运行时开销。 .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 的调试体验更为协调。
结论
对于许多人来说,使用源生成器已经足够复杂,因此通过工具支持来更好地理解生成器非常宝贵。 如果先前源生成器让您感觉有些可怕,我希望本文对工具支持的概述能带给您尝试的勇气。
一如既往,希望您喜欢这篇文章,并在下方评论区留言。
图片来源:Denny Müller
本博文英文原作者: