C# 使用MSBuild 14时禁用代码分析

C# 使用MSBuild 14时禁用代码分析,c#,visual-studio-2015,msbuild,msbuild-14.0,C#,Visual Studio 2015,Msbuild,Msbuild 14.0,我有一个包含几个C#6.0项目的.NET解决方案。每一个项目都引用了。在VisualStudio中,我可以区分构建和分析代码,但我不知道如何在命令行(例如在CI服务器上)上使用MSBuild v14.0来实现这一点。我正在使用以下选项调用msbuild mySolution.sln/t:Rebuild,但这些选项均无效: /p:runcodesanalysis=False /p:RunCodeAnalysisOnThisProject=False /p:RunCodeAnalysis=Fals

我有一个包含几个C#6.0项目的.NET解决方案。每一个项目都引用了。在VisualStudio中,我可以区分构建和分析代码,但我不知道如何在命令行(例如在CI服务器上)上使用MSBuild v14.0来实现这一点。我正在使用以下选项调用
msbuild mySolution.sln/t:Rebuild
,但这些选项均无效:

  • /p:runcodesanalysis=False
  • /p:RunCodeAnalysisOnThisProject=False
  • /p:RunCodeAnalysis=False,RunCodeAnalysisOnThisProject=False
无论我做什么,警告都会保留在输出中。有人知道如何在使用MSBuild时禁用代码分析吗

背景:在我们的CI服务器上,我想区分“基本MSBuild警告”和来自静态代码分析的警告

问候

有人知道如何在使用MSBuild时禁用代码分析吗

生成服务器TFSBuild.proj中定义的RunCodeAnalysis设置与本地MSBuild项目架构选项有很大不同

构建服务器支持RunCodeAnalysis的值“始终、默认、从不”。相反,本地MSBuild支持运行代码分析的“True或False

您可以查看Microsoft.TeamFoundation.Build.targets文件的部分:

<Target Name="CoreCompileSolution">
 
  <PropertyGroup>
    <CodeAnalysisOption Condition=" '$(RunCodeAnalysis)'=='Always'">RunCodeAnalysis=true</CodeAnalysisOption>
    <CodeAnalysisOption Condition=" '$(RunCodeAnalysis)'=='Never'">RunCodeAnalysis=false</CodeAnalysisOption>
    <!-- ... -->
  </PropertyGroup>
  <!-- ... -->
</Target>

它实际上不受支持,但有一个解决方法:

在解决方案根文件夹中的{SolutionName}.sln.targets(msbuild<15.0)之后创建一个
目录.Build.targets
(msbuild>=v15.0),
,并添加:

<Project>
  <Target Name="DisableAnalyzers" 
           BeforeTargets="CoreCompile" 
           Condition="'$(UseRoslynAnalyzers)' == 'false'"> 
    <!-- 
       Disable analyzers via an MSBuild property settable on the command line. 
    --> 
    <ItemGroup> 
      <Analyzer Remove="@(Analyzer)" /> 
    </ItemGroup> 
  </Target> 
</Project>

.Net 5
支持的项目中,您只需编辑
.csproj
并添加:

  • false
    禁用生成时的代码分析
  • false
    在实时分析中禁用代码分析
  • false
    阻止分析器在此项目上运行
我在单元测试项目中使用它,方法是将它添加到保存
TargetFramework
PropertyGroup
中,如下所示:

<PropertyGroup>
        <TargetFramework>net5.0</TargetFramework>
        <IsPackable>false</IsPackable>
        <!--disable code analysis on this XUNIT Project-->
        <RunAnalyzersDuringBuild>false</RunAnalyzersDuringBuild>
        <RunAnalyzersDuringLiveAnalysis>false</RunAnalyzersDuringLiveAnalysis>
        <RunAnalyzers>false</RunAnalyzers>
</PropertyGroup>

net5.0
假的
假的
假的
假的

有关更多详细信息,请参阅

谢谢您的回复,但我们使用的不是TFS,而是Jenkins。无论如何,使用Never代替False不会改变行为。很抱歉延迟回复。我在Jenkins上创建了一个测试演示,runcodealysis=False,一切正常。你可以在答案中参考我的更新。谢谢你的回复。对我来说,将RunCodeAnalysis设置为False就像禁用StyleCop.Analyzers一样,很抱歉不够清晰。如果要排除来自StyleCop.Analyzers的MSBuild警告,我必须做什么?还是不可能?@mu88,你可以参考我答案中的更新2,看看它是否解决了你的问题。如果上面的答案解决了您的问题,您可以将其标记为“答案”,这样就可以帮助其他社区成员解决同样的问题。如果没有,你可以告诉我们你的问题。谢谢。谢谢你的更新,但我想在MSBuild级别而不是源代码中禁用StyleCop警告。相关:你尝试过这个吗?对我来说,它似乎不会在
BeforeTargets=“CoreCompile”
上触发。我添加了一条在
BeforeTargets=“Build”
上看到的消息,但它仍在尝试运行analyzers.Nuget、packages.config和after.solution.sln.targets(因为它是msbuild v14)。我发现了问题,我们将目标指定为msbuild的参数,如
/t:Clean,Build
。这在msbuild>14和DisableAnalyzers目标工作时效果良好。但在使用msbuild 14时,这会导致DisableAnalyzers目标未触发。如果将目标添加到参数中,我们可以看到它以某种方式通过我们添加的日志消息运行,但它不会影响分析器。因此,我们的解决方案似乎是在使用msbuild 14时只使用默认目标,而不是显式地为msbuild提供目标。但奇怪的是,在不使用msbuild v14的显式目标参数时,它甚至不尝试运行分析器,不管DisableAnalyzers的目标是什么……你能用重要的细节对答案进行编辑吗。很高兴你找到了一个有效的解决方案!现在请尽快升级到MsBuild 16;)。
<Target Name="DisableAnalyzers" 
        BeforeTargets="CoreCompile" 
        Condition="
           '$(UseRoslynAnalyzers)' == 'false' 
           or '$(RunCodeAnalysis)' == 'false' 
           or '$(RunCodeAnalysis)' == 'never'" >
<PropertyGroup>
        <TargetFramework>net5.0</TargetFramework>
        <IsPackable>false</IsPackable>
        <!--disable code analysis on this XUNIT Project-->
        <RunAnalyzersDuringBuild>false</RunAnalyzersDuringBuild>
        <RunAnalyzersDuringLiveAnalysis>false</RunAnalyzersDuringLiveAnalysis>
        <RunAnalyzers>false</RunAnalyzers>
</PropertyGroup>