【问题标题】:Use Roslyn code analyzer in same solution在同一解决方案中使用 Roslyn 代码分析器
【发布时间】:2019-03-19 15:11:55
【问题描述】:

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

  • 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】:

    从字面上看,昨天我想为我正在开发的产品创建一组分析器,但在不同的解决方案中执行此操作并安装私有 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”文件来添加这个项目引用。这样,在该文件夹中创建的所有项目都会自动使用我创建的分析器。

    【讨论】:

    • 首先,我爱你。这应该在官方文档中。其次,对于想要将其他分析器与他们自己的分析器捆绑在一起的任何人,并在它们是依赖项并且您自己的分析器项目包含在 NuGet 包中时有效地反映被引用的其他分析器的功能:将&lt;ReferenceOutputAssembly&gt; 设置为true.
    • 是我还是以这种方式导入的分析器没有显示波浪线(但它们确实在 dotnet build 中显示为警告)?
    • 你能确认它是否适用于 dotnet build 命令
    【解决方案2】:

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

    这个包作为nuget依赖安装说明有特定的属性来识别依赖内容的类型:

    &lt;IncludeAssets&gt;runtime; build; native; contentfiles; analyzers&lt;/IncludeAssets&gt;

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

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

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

    【讨论】:

    • 谢谢。经过大量研究后,我得出了相同的结论:VSIX 和 NuGet 是唯一的选择。这会有点麻烦,但我可以让它工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2013-07-28
    • 2023-04-01
    相关资源
    最近更新 更多