12

我继承了一个使用 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 输出。有人可以帮我理解这里发生了什么吗?

4

2 回答 2

20

我在发布后不久就发现了这一点。

Team Build 支持 RunCodeAnalysis 的以下值:AlwaysDefaultNever

相比之下,本地 MSBuild 支持RunCodeAnalysis 的TrueFalse

为什么它们不同?在查看 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

于 2011-06-19T18:32:17.987 回答
8

改变:

<RunCodeAnalysis>false</RunCodeAnalysis>

至:

<RunCodeAnalysis>Never</RunCodeAnalysis>

...看看这是否能解决您的问题。的有效值为RunCodeAnalysis{ Default, Always, Never} 或 { True, False},具体取决于您的构建方式。

有关详细信息,请参阅:如何:编辑构建类型的第 12 项。

此外,请参阅本文了解 RunCodeAnalysis 设置中的不一致,具体取决于您的构建方式:Inconsistent RunCodeAnalysis values

于 2011-06-18T21:46:39.343 回答