我在命令行上使用MSBUILD构建我的解决方案,如下所示:
msbuild %SOLUTION% /m /fl /flp:LogFile="%OUTPUTFILE%" /p:Configuration=%BUILDCONFIG% /p:RunCodeAnalysis=True
为本地(PREfast)和托管(FxCop)代码创建/p:RunCodeAnalysis=True
代码分析结果,但我的问题是,本机代码的分析结果文件未放入$(OutDir)
这样的代码中是manged代码结果的情况。它们存储在每个程序集的obj
文件夹中(= $(IntDir)
)。
我跟踪了标准目标文件Microsoft.CodeAnalysis.Targets
的路径,然后更改了行
<MergedOutputCodeAnalysisFile>$(IntDir)vc.nativecodeanalysis.all.xml</MergedOutputCodeAnalysisFile>
到
<MergedOutputCodeAnalysisFile>$(OutDir)$(TargetName).nativecodeanalysis.TEST.xml</MergedOutputCodeAnalysisFile>
并且它有效,但我不能要求每个开发人员在他/她的系统上更改此文件,因此我需要一种方法在项目文件中设置它。我已经尝试了以下方法,但没有成功:
为每个项目文件添加一个属性(在根级别上):
<PropertyGroup>
<OutputCodeAnalysisFile>$(OutDir)$(TargetName).NativeCodeAnalysis.TEST.xml</OutputCodeAnalysisFile>
</PropertyGroup>
使用所需的属性值调用MSBUILD:
msbuild %SOLUTION% /m /fl /flp:LogFile="%OUTPUTFILE%" /p:Configuration=%BUILDCONFIG% /p:RunCodeAnalysis=True /p:MergedOutputCodeAnalysisFile="$(OutDir)$(TargetName).nativecodeanalysis.TEST.xml"
在vcxproj
之后将这些行添加到<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
文件中使用目标注入:
<PropertyGroup>
<RunMergeNativeCodeAnalysisDependsOn>
$(RunMergeNativeCodeAnalysisDependsOn);
CustomOutputNativeCodeAnalysisFile
</RunMergeNativeCodeAnalysisDependsOn>
</PropertyGroup>
<Target Name="CustomOutputNativeCodeAnalysisFile">
<PropertyGroup>
<OutputCodeAnalysisFile>$(OutDir)$(TargetName).NativeCodeAnalysis.TEST.xml</OutputCodeAnalysisFile>
</PropertyGroup>
</Target>
有谁知道,如何在不触及标准代码分析目标的情况下解决问题?
答案 0 :(得分:0)
不幸的是,我自己尝试使用您在上面确定的相同策略更改单个文件的输出时,我没有成功。但是,我已成功更改合并文件的位置,这可能是您的问题的解决方法。
要记住的重要一点是MSBuild在评估多个属性表时使用最后一个属性。
我发现Microsoft.CodeAnalysis.Targets
文件包含在我正在使用的.vcxproj末尾的一行中:
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
注意:您可以从Microsoft.CodeAnalysis.Targets
向后追溯 - 我会将其留作读者练习。
我最终做的是定义一个包含以下内容的.props文件:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<RunCodeAnalysis>true</RunCodeAnalysis>
<CodeAnalysisTreatWarningsAsErrors>false</CodeAnalysisTreatWarningsAsErrors>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<EnablePREfast>true</EnablePREfast>
<AdditionalOptions>%(ClCompile.AdditionalOptions) /analyze:quiet</AdditionalOptions>
</ClCompile>
</ItemDefinitionGroup>
<PropertyGroup>
<MergedOutputCodeAnalysisFile>$(OutDir)$(ProjectName).vc.nativecodeanalysis.all.xml</MergedOutputCodeAnalysisFile>
</PropertyGroup>
</Project>
一旦我有了这个.props文件,我就把它包含在之后我的.vcxproj中的Microsoft.Cpp.targets
文件:
<ImportGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<!-- IMPORTANT. The analysis.props file you made *must* come after the Microsoft.Cpp.targets file! -->
<Import Project="..\..\Config\VSPropertySheets\CodeAnalysis.props" />
</ImportGroup>
这生成了*.nativecodeanalysis.xml
个文件并将合并的输出文件设置为我指定的内容。
我知道这没有回答你的问题,但它可能会为你提供另一种解决方案,让你在一个地方获得分析结果。不幸的是,我没有评论的声誉,或者我会把它添加为一个。我本周末希望更多地进行这一调查,看看我是否能真正解决你的问题。
答案 1 :(得分:0)
只需更改项目属性中的选项: 右键单击项目,选择属性 在“标签代码分析/常规”上,取消选中在“构建”上启用代码分析
答案 2 :(得分:0)
我相信这样做的最标准方法(更改/覆盖 MSBuild 项目属性)是使用 Directory.build.props,它允许您在解决方案范围级别或项目范围级别覆盖 MSBuild 属性 - 基于位置文件 - 至少对于 C++ 和 C#。