使用MSBuild禁用某些项目的代码分析

时间:2011-06-18 21:31:58

标签: visual-studio-2010 static-code-analysis

我继承了一个使用MSBuild脚本编译多个解决方案的解决方案文件。大多数项目都配置了分析和规则集,我有一些单元测试项目没有。

启用分析的项目:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
  <DebugSymbols>true</DebugSymbols>
  <DebugType>full</DebugType>
  <DefineConstants>CODE_ANALYSIS;DEBUG;TRACE</DefineConstants>
  <Optimize>false</Optimize>
  <OutputPath>bin\Debug</OutputPath>
  <PlatformTarget>x86</PlatformTarget>
  <CodeAnalysisRuleSet>..\OurRules.ruleset</CodeAnalysisRuleSet>
  <RunCodeAnalysis>true</RunCodeAnalysis>
 </PropertyGroup>

关闭分析的项目:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
  <DebugSymbols>true</DebugSymbols>
  <DebugType>full</DebugType>
  <DefineConstants>DEBUG;TRACE</DefineConstants>
  <Optimize>false</Optimize>
  <OutputPath>bin\Debug</OutputPath>
  <PlatformTarget>x86</PlatformTarget>
  <RunCodeAnalysis>false</RunCodeAnalysis>
 </PropertyGroup>

当我运行构建脚本时,看起来某些项目不尊重项目设置:

msbuild.exe BuildScript.proj /p:SolutionRoot=%cd%; /p:Configuration=Debug /p:Platform:x86 /p:RunCodeAnalysis=True

当我检查输出文件夹时,我看到RunCodeAnalysis标志设置为false的项目的覆盖率分析xml输出。有人可以帮我理解这里发生了什么吗?

2 个答案:

答案 0 :(得分:20)

我发布后不久便想出来了。

Team Build支持RunCodeAnalysis的以下值:始终默认从不

相比之下,本地MSBuild支持RunCodeAnalysis的 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>

然后在编译解决方案文件时将这些设置传递到msbuild进程。

换句话说:

始终告诉MSBuild使用 RunCodeAnalysis = True

编译所有项目

从不告诉MSBuild在所有项目中禁止代码分析( RunCodeAnalysis = False)

... 没有为RunCodeAnalysis指定值意味着MSBuild将尊重项目文件中的RunCodeAnalysis设置。因此,默认设置。

从原始问题中删除/ p:RunCodeAnalysis只是正确的结果。打开分析的项目将运行代码分析。没有设置的项目不会执行任何额外的工作。

有关此内容的更多信息,请访问:http://www.bryancook.net/2011/06/build-server-code-analysis-settings.html

答案 1 :(得分:8)

变化:

<RunCodeAnalysis>false</RunCodeAnalysis>

要:

<RunCodeAnalysis>Never</RunCodeAnalysis>

...看看是否能解决您的问题。 RunCodeAnalysis的有效值为{DefaultAlwaysNever}或{TrueFalse},具体取决于您的构建方式。

请参阅:How to: Edit a Build Type的第12项了解更多信息。

另外,请参阅此文章,了解RunCodeAnalysis的设置是否存在不一致,具体取决于您的构建方式:Inconsistent RunCodeAnalysis values