在命令行上运行MSBUILD时,如何设置本机代码分析日志的输出路径

时间:2014-11-10 12:49:31

标签: visual-studio-2012 msbuild native-code static-code-analysis prefast

我在命令行上使用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>

并且它有效,但我不能要求每个开发人员在他/她的系统上更改此文件,因此我需要一种方法在项目文件中设置它。我已经尝试了以下方法,但没有成功:

  1. 为每个项目文件添加一个属性(在根级别上):

     <PropertyGroup>
         <OutputCodeAnalysisFile>$(OutDir)$(TargetName).NativeCodeAnalysis.TEST.xml</OutputCodeAnalysisFile>
     </PropertyGroup>
    
  2. 使用所需的属性值调用MSBUILD:

    msbuild %SOLUTION% /m /fl /flp:LogFile="%OUTPUTFILE%" /p:Configuration=%BUILDCONFIG% /p:RunCodeAnalysis=True /p:MergedOutputCodeAnalysisFile="$(OutDir)$(TargetName).nativecodeanalysis.TEST.xml"
    
  3. 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>
    
  4. 有谁知道,如何在不触及标准代码分析目标的情况下解决问题?

3 个答案:

答案 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#。

Screenshot of Enabling Clang-Tidy and Code Analysis On Build in Directory.build.props