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

Kyl*_*yle 7 msbuild tfs code-analysis build tfs2012

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

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

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

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

场景1 - 在我们的开发人员机器上的示例应用程序中,当您选择项目设置时(右键单击 - >解决方案资源管理器中的属性),如果我打开"在构建时启用代码分析"并选择规则,请转到代码分析选项卡从下拉列表设置执行为exepcted,因此它将生成一些警告.<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>
Run Code Online (Sandbox Code Playgroud)

但它们似乎没有用,或者我把它们放在错误的地方?如何正确修复/使用它们?

仅供参考我通过以下方式在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>
Run Code Online (Sandbox Code Playgroud)

在构建服务器上,我确实在c:\ Program Files(x86)\ MSBuild\Microsoft\VisualStudio\v11.0\CodeAnalysis中找到了代码分析的目标文件的引用,但我不想更改构建服务器上的默认行为(虽然它确实有效但我这样做.必须将CodeAnalysisTreatWarningsAsErrors的条件评估为false.就像我的值不是从TFSBuild.proj中读取的,而是来自.csproj文件.

任何问题都可以提前询问和感谢

MBL*_*MBL 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

<BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
                BuildUri="$(BuildUri)"
                Status="Failed"
                Message="%(AllErrorLines.Identity)"/>
Run Code Online (Sandbox Code Playgroud)

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