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

在TFSBuild.proj中设置代码分析设置,build,tfs,msbuild,code-analysis,Build,Tfs,Msbuild,Code Analysis,我正在尝试设置/覆盖TFS测试安装中的一些设置,这些设置涉及在构建过程中强制进行代码分析和关联设置(无论项目文件中的设置如何) 我们目前在测试TFS安装中使用: Visual Studio 2012 Ultimate在我们的开发人员机器和构建服务器上运行 在一台服务器上安装TFS 2012(应用程序和数据层) 在另一台服务器上安装TFS 2012生成服务(控制器和代理) 我们可以按预期编译示例.NET4.5项目(类库(DLL)、web应用程序等)。这仅仅是为了覆盖相关的代码分析设置(希望如此

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

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

  • Visual Studio 2012 Ultimate在我们的开发人员机器和构建服务器上运行
  • 在一台服务器上安装TFS 2012(应用程序和数据层)
  • 在另一台服务器上安装TFS 2012生成服务(控制器和代理)
我们可以按预期编译示例.NET4.5项目(类库(DLL)、web应用程序等)。这仅仅是为了覆盖相关的代码分析设置(希望如此)

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

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

始终

这是有效的,这就是我们将如何在构建中强制进行代码分析(经验教训:-)

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

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

总是
AllRules.ruleset
真的
但它们似乎不起作用,或者我把它们放错地方了?如何正确地修复/使用它们

仅供参考,我通过以下方式在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>

调试
任何CPU
在生成服务器上,我确实在c:\Program Files(x86)\MSBuild\Microsoft\VisualStudio\v11.0\CodeAnalysis中找到了对代码分析目标文件的引用,但我不想更改生成服务器上的默认行为(尽管我这样做时它确实起作用)。例如,CodeAnalysisTreatmentWarningAsErrors的条件必须被评估为false。我的值不是从TFSBuild.proj读取的,而是从.csproj文件读取的


如果有任何问题,请随时提问并提前感谢

我记得有过类似的问题-但没有时间调查,我通过直接使用exec任务致电FxCop解决了这个问题。我只给你重点,省略了一些属性的说明,我希望名称是清楚的

我创建了一个输出DLL的项目组,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>

:错误
“$(FXCOPATH)”/gac/rule:”$(FxCopRules)”/ruleset:“$(FxCopRuleSet)”@(文件分析->”/file:“%(标识)”,“”)/out:$(完整的FXCOPLOG)/控制台|查找“$(FxCopErrorLinePattern)”>“$(FxCopLogFile)”
然后,我可以使用extensionpack任务确定输出中的错误数:

<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文件中,因此将代码分析添加到解决方案就是导入该文件,也许还需要通过设置适当的属性来调整行为。

我认为巡航控制系统也存在类似的问题,没有使用
代码分析编译符号进行编译,即使在VS.Net中选中了“在生成时启用代码分析(定义代码分析常量)”

无论是否选中,
code\u ANALYSIS
实际上没有明确添加到csproj中的编译符号列表中(即使它出现在“条件编译符号”文本框中),只添加了
true

通过VS.Net编译时,会自动添加
code\u分析
,但在使用巡航控制系统使用的MSBuild时不会添加


我最终在VS.Net中将“条件编译符号”从“代码分析”;MySymbol“到”MySymbol;代码分析。这样做迫使代码分析也出现在csproj中。

我爱你,伙计!那是什么样的错误?!:)-在我们的项目调试中,在尝试了各种方法来启用它之后,它又开始工作了。重新排序完成了…!--