我正在尝试设置/覆盖TFS TEST安装中的一些设置,以便在构建过程中强制执行代码分析和相关设置(无论项目文件的设置是什么)
我们目前在TEST TFS安装中使用:
我们可以按预期编译样本.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文件。
任何问题都可以随意提出并提前致谢
答案 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文件中隔离了所有这些,因此向解决方案添加代码分析是导入该文件的问题,也许可以通过设置适当的属性来调整行为。