在同一解决方案中使用Roslyn代码分析器

问题描述 投票:2回答:1

我有一个由几个.NET Core项目组成的解决方案。我有一些我想要执行的代码分析任务仅适用于此解决方案,因此将它们放在单独的repo /解决方案中是没有意义的。使用适当的模板,我为分析器创建了三个项目:

  • Example.Analyzer
  • Example.Analyzer.Test
  • Example.Analyzer.Vsix

Example.Analyzer.Vsix无法编译,因为Visual Studio需要.NET Framework,但我的目标是.NET Core以供跨平台使用。现在,我忽略了那个项目,但我打算删除它。 Example.Analyzer和Example.Analyzer.Test都将netcoreapp3.0与解决方案中的所有其他项目一起定位。

我写了我的分析仪,测试通过了。但是,我不确定如何从其他项目中实际使用这些分析仪。我尝试通过ProjectReference添加Example.Analyzer作为依赖项,但似乎没有启用分析器。

c# .net .net-core roslyn
1个回答
2
投票

根据我的发现,有两种方法可以为项目添加分析器支持:通过vsix或nuget包(如在example here中)。

将此包安装为nuget依赖项表明存在特定属性来标识依赖项内容的类型:

<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>

如您所见,其中一种资产类型是分析器。不幸的是,似乎不支持为项目依赖项设置“IncludeAssets”属性,即使它在属性窗格中可见。

我建议你尝试nuget引用而不是项目引用。

要从项目中获取nuget包,只需右键单击它并选择发布。此外,还需要本地nuget存储库源代码才能将新的nuget存储在那里。


0
投票

昨天我想为我正在研发的产品创建一套分析仪,并且在一个不同的解决方案中做这个并且放在一个私有的Nuget上是没有意义的,所以我可以使用它们。我找到了一个完美的解决方案:

  1. 在要分析的项目中,添加对包含分析器的项目的引用。
  2. 编辑项目文件,找到刚刚创建的ProjectReference标记,并添加属性ReferenceOutputAssembly = false,OutputItemType = Analyzer。它看起来应该类似于:
<ProjectReference Include="..\..\analyzers\AnalyzersProject\AnalyzersProject.csproj">
  <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
  <OutputItemType>Analyzer</OutputItemType>
</ProjectReference>

这就是所需要的。现在,只要您的解决方案构建完毕,您的新分析仪就应该可以运行。唯一需要注意的是Visual Studio似乎会缓存分析器,因此如果您更改它,您可能需要关闭并重新打开VS以使新的/更改的分析器工作。

尽我所能,我不能完全赞成这一点。我昨天确实非常接近这个解决方案,但今天早上我找到了一个简化了一点的blog post(这是我从上面得到最终解决方案的地方,我有一些“不必要的”线)

我在我的案例中做的一件事是利用我的项目文件夹中的“Directory.Build.props”文件添加此项目参考。这样,在该文件夹中创建的所有项目都会自动使用我创建的分析器。

© www.soinside.com 2019 - 2024. All rights reserved.