在TFSBuild.proj中设置代码分析设置

时间:2012-09-10 15:03:06

标签: build tfs msbuild code-analysis tfs2012

我正在尝试设置/覆盖TFS TEST安装中的一些设置,以便在构建过程中强制执行代码分析和相关设置(无论项目文件的设置是什么)

我们目前在TEST TFS安装中使用:

  • 我们的开发者计算机和构建服务器上的Visual Studio 2012 Ultimate
  • 在一台服务器(应用程序和数据层)上安装TFS 2012
  • 让TFS 2012构建服务(控制器和代理)安装在另一台服务器上

我们可以按预期编译样本.net 4.5项目(类库(DLL),Web应用程序等)。这仅与覆盖相关的代码分析设置有关(希望如此)。

场景1 - 在我们的开发人员计算机上的示例应用程序中,当您选择项目设置时(右键单击 - &gt;解决方案资源管理器中的属性),如果我打开“在构建时启用代码分析”,请转到代码分析选项卡并从下拉列表中选择一个规则集按预期执行,因此它将生成一些警告。如果在记事本中打开,此技术会将<RunCodeAnalysis>false</RunCodeAnalysis>添加到* .csproj文件中。如果执行构建以编译示例项目/解决方案,则按预期执行代码分析。我不想在每个项目上都这样做,因为开发人员可以关闭它(虽然我希望有签到政策和/或私人/门禁签到以及强制这样做。)

场景2 - 我可以禁用“在构建时启用代码分析”复选框并在我们的TFSBuild.proj文件中强制执行代码分析(我们将使用默认的upgradetemplate.xaml作为我们的流程定义,因为我们将从TFS升级2008年在我们的LIVE TFS安装上):

  

<RunCodeAnalysis>Always</RunCodeAnalysis>

这是有效的,这就是我们将如何强制(仍然需要学习的经验:-))我们构建的代码分析。

设置其他已解决的代码分析设置时会出现问题。例如,应用/使用或将CA警告视为错误的默认规则集。通过在记事本中编辑* .csproj,可以在VS或所有设置中设置其中一些设置。如果我编辑* .csproj,那么这些值将按预期在构建中使用(以及在开发人员计算机上本地使用)。这并不理想,因为我想在TFSBuild.proj中集中进行,而不必编辑每个项目文件。我相信我可以使用我的TFSbuild.proj文件中的设置:

<PropertyGroup>
    <RunCodeAnalysis>Always</RunCodeAnalysis>
    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
    <CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
</PropertyGroup>

但它们似乎不起作用或我把它们放在错误的地方?如何正确修复/使用它们?

仅供参考我通过以下方式在TFSBuild.proj中构建我的解决方案:

<Project DefaultTargets="DesktopBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">

  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets" />
          <ItemGroup>
            <SolutionToBuild Include="/some folder/some solution.sln" />
            <ConfigurationToBuild Include="Debug|Any CPU">
               <FlavorToBuild>Debug</FlavorToBuild>
               <PlatformToBuild>Any CPU</PlatformToBuild>
             </ConfigurationToBuild>
          </ItemGroup>
</Project>

在构建服务器上,我确实在c:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ CodeAnalysis中找到了对Code Analysis目标文件的引用,但我不想更改构建服务器(虽然它确实可以工作)。必须将CodeAnalysisTreatWarningsAsErrors的条件评估为false。就像我的值不是从TFSBuild.proj中读取的,而是来自.csproj文件。

任何问题都可以随意提出并提前致谢

2 个答案:

答案 0 :(得分:2)

我认为Cruise Control没有使用CODE_ANALYSIS编译符号进行编译的类似问题,即使在VS.Net中检查了“在构建时启用代码分析(定义CODE_ANALYSIS常量)”。

看起来是否检查,CODE_ANALYSIS实际上没有明确地添加到csproj中的编译符号列表中(即使它出现在文本框“条件编译符号”中),只有{ {1}}已添加。

通过VS.Net进行编译时,<RunCodeAnalysis>true</RunCodeAnalysis>会自动添加,但在使用MSBuild时则不会,这是Cruise Control使用的。

我最终在VS.Net中将“条件编译符号”从“CODE_ANALYSIS; MySymbol”更改为“MySymbol; CODE_ANALYSIS”。这样做迫使CODE_ANALYSIS也出现在csproj中。

答案 1 :(得分:1)

我记得有一个类似的问题 - 但没有时间去研究它,我通过直接使用exec任务调用FxCop来解决它。我只是给你一些亮点,省略一些属性的规范,我希望这些名字很清楚。

我创建了一个输出dll的ItemGroup,FilesToAnalyze,并以类似于以下的方式将其提供给FxCop:

<PropertyGroup>
      <FxCopErrorLinePattern>: error</FxCopErrorLinePattern>
      <FxCopCommand>"$(FxCopPath)" /gac /rule:"$(FxCopRules)" /ruleset:="$(FxCopRuleSet)"  @(FilesToAnalyze->'/file:"%(identity)"', ' ') /out:$(FullFxCopLog) /console | Find "$(FxCopErrorLinePattern)" > "$(FxCopLogFile)"</FxCopCommand>
</PropertyGroup>    

<Exec Command="$(FxCopCommand)"
      ContinueOnError="true">
  <Output TaskParameter="ExitCode" PropertyName="FxCopExitCode"/>
</Exec>

<ReadLinesFromFile File="$(FxCopLogFile)">
    <Output TaskParameter="Lines" ItemName="AllErrorLines"/>
</ReadLinesFromFile>

然后我可以使用扩展包任务确定输出中的错误数量:

<MSBuild.ExtensionPack.Framework.MsBuildHelper TaskAction="GetItemCount" InputItems1="@(AllErrorLines)">
    <Output TaskParameter="ItemCount" PropertyName="FxErrorCount"/>
</MSBuild.ExtensionPack.Framework.MsBuildHelper>

为每个错误创建一个失败的构建步骤:

<BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
        BuildUri="$(BuildUri)"
        Id="$(FxCopStep)"
        Status="Failed"
        Message="FxCop Failed: $(FxErrorCount) errors."/>

<BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
                BuildUri="$(BuildUri)"
                Status="Failed"
                Message="%(AllErrorLines.Identity)"/>

通过这种方式对构建服务器进行代码分析,我们还避免了必须单独配置每个项目。我们在一个单独的.targets文件中隔离了所有这些,因此向解决方案添加代码分析是导入该文件的问题,也许可以通过设置适当的属性来调整行为。