7

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

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

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

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

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

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

<RunCodeAnalysis>Always</RunCodeAnalysis>

这是可行的,这就是我们将如何强制(仍有待学习的课程:-))对我们的构建进行代码分析。

然后在设置其他相关的代码分析设置时出现问题。例如,应用/使用哪些默认规则集或将 CA 警告视为错误。其中一些设置可以在 VS 中设置,也可以通过在记事本中编辑 *.csproj 来设置。如果我编辑 *.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 找到了对代码分析目标文件的引用,但我不想更改构建服务器上的默认行为(虽然当我这样做时它确实有效)。例如 CodeAnalysisTreatWarningsAsErrors 的条件必须被评估为假。就像我的值不是从 TFSBuild.proj 读取的,而是从 .csproj 文件中读取的。

如有任何问题,请随时提出并提前致谢

4

2 回答 2

2

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

看起来是不是check,CODE_ANALYSIS实际上并没有显式添加到csproj中的编译符号列表中(即使出现在文本框“条件编译符号”中),只是<RunCodeAnalysis>true</RunCodeAnalysis>添加了。

通过 VS.Net 编译时,CODE_ANALYSIS会自动添加,但在使用 Cruise Control 使用的 MSBuild 时不会。

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

于 2013-03-25T02:56:51.440 回答
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 文件中,因此将代码分析添加到解决方案中只需导入该文件,并可能通过设置适当的属性来调整行为。

于 2012-12-04T06:57:30.363 回答