【问题标题】:Compilation succeeded even though there were some errors from Roslyn Diagnostic Analyzer即使 Roslyn 诊断分析器出现一些错误,编译也成功
【发布时间】:2014-09-30 06:16:46
【问题描述】:

DiagnosticAnalyzer 是一个基于 Roslyn 的自定义扩展,其 DiagnosticDescriptorDiagnosticSeverity.Error 如下所示

internal static DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Description, MessageFormat, Category, DiagnosticSeverity.Error);

使用扩展程序时,它会在代码上显示红色波浪线,这违反了诊断分析器自定义规则,强调这是一个错误,它甚至显示在 Visual Studio 的错误列表窗口中。

但编译后,这段代码在Visual Studio的输出窗口中得到编译成功消息。这与将错​​误强调为诊断分析器的严重性的整个概念背道而驰。

如果这是 Roslyn 的默认工作方式,那么我们是否有解决方法来停止编译

我正在使用:

  1. Visual Studio 2013 更新 3
  2. Roslyn 最终用户 Preview.vsix
  3. 包含使用 Roslyn SDK 项目 Templates.vsix 制作的 DiagnosticAnalyzer 的 VSIX 扩展

【问题讨论】:

    标签: c# visual-studio-2013 roslyn vsix


    【解决方案1】:

    将诊断集成到实际构建管道中已作为 VS“14”的一部分进行。如果在那里尝试相同的场景,则会导致编译错误。

    此外,诊断现在已附加到项目并通过 NuGet 分发,因此错误将在整个团队、持续集成构建等中始终如一地发生。

    【讨论】:

    • 那么我该怎么做才能得到 Visual Studio 2013 Update 3 的编译错误(因为如果我不能,那么为使用 VS2013 的项目开发 DiagnosticAnalyzer 是没有用的- U3,如果有解决方法来停止编译,请务必提及),我不清楚诊断的 NuGet 分发。
    • Roslyn 没有内置 VS 2013 的方法 - 我们一直将精力集中在 VS“14”上。您可以考虑制作一个自定义构建任务,将您的诊断作为 MSBuild 的一部分运行。如果您想走这条路线,以下答案可能会有所帮助:stackoverflow.com/questions/13052115/….
    • 通过 NuGet 分发诊断意味着它们可以与目标库一起打包,并且配置的诊断集随项目一起传播,而不是取决于每个用户碰巧安装了哪些 vsix。
    • 您展示的示例要求我更改正在编译的项目的csproj。由于很多采用问题,这无法完成,因为这将用于我们主流项目的内部代码质量监控。我们能否使用 DTE OnBuildBegin event 从错误列表中获取信息,然后硬停止构建。当我开始构建时,我们如何运行诊断?如何利用它来停止构建?
    • 你有没有进一步追求这个?我在 VS2015 中,分析器的错误并没有破坏构建。
    【解决方案2】:

    我正在使用 VS2015 Update 3,但这个问题仍然存在。我想强制执行局部变量和参数命名约定,结果 Roslyn 默认不支持这些,只能通过解决方法:SO link

    如果出现这样的错误,我想构建失败,但 Roslyn 没有这个能力。

    Roslyn 本来可以是一个非常强大和强大的工具,但它在最基本的任务中仍然失败。太可惜了。

    (对于版主:我仍然没有 50 个代表可以发表评论,我想我永远不会有)

    【讨论】:

    • 他们说有一种解决方法,如果将分析器创建为 NuGet 包,它将起作用(破坏构建)。 Related GitHub issue
    • 我试过了,如果分析器被上传到 NuGet 商店并且项目将它作为 NuGet 包引用,它就可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 2012-02-04
    相关资源
    最近更新 更多