Use Roslyn code analyzer in same solution

时间:2019-03-19 15:11:55

标签: c# .net .net-core roslyn

I have a solution comprised of several .NET Core projects. I have a few code analysis tasks I'd like to perform that are only applicable to this solution, so it doesn't make sense to put them in a separate repo/solution. Using the appropriate template, I've created three projects for the analyzers:

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

Example.Analyzer.Vsix doesn't compile because Visual Studio requires .NET Framework, but I'm targeting .NET Core for cross-platform use. For now, I'm ignoring that project, but I intend to delete it. Example.Analyzer and Example.Analyzer.Test both target netcoreapp3.0, along with all the other projects in the solution.

I've written my analyzers and the tests pass. However, I'm not sure how to actually use these analyzers from the other projects. I've tried adding Example.Analyzer as a dependency via a ProjectReference, but that doesn't seem to enable the analyzers.

2 个答案:

答案 0 :(得分:4)

昨天从字面上看,我想为我正在研究的产品创建一套分析器,而在另一种解决方案中将其安装在私有的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”文件来添加此项目引用。这样,在该文件夹中创建的所有项目都将使用我创建的分析器自动进行。

答案 1 :(得分:2)

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

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

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

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

我建议您尝试使用nuget参考而不是项目参考。

要从项目中获取nuget包,只需右键单击它,然后选择发布。 另外,将需要本地nuget存储库源来将新的nuget放在此处。