【问题标题】:How to set the output path for native code analysis logs, when running MSBUILD on command line在命令行上运行 MSBUILD 时如何设置本机代码分析日志的输出路径
【发布时间】:2015-01-06 18:47:07
【问题描述】:

我在命令行上使用 MSBUILD 构建我的解决方案,如下所示:

msbuild %SOLUTION% /m /fl /flp:LogFile="%OUTPUTFILE%" /p:Configuration=%BUILDCONFIG% /p:RunCodeAnalysis=True

拥有/p:RunCodeAnalysis=True 为本机(PREfast)和托管(FxCop)代码创建代码分析结果,但我的问题是,本机代码的分析结果文件没有放入 $(OutDir) 就像它的情况一样管理代码结果。它们存储在每个程序集的 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 文件中&lt;Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /&gt; 之后来使用目标注入:

    <PropertyGroup>
      <RunMergeNativeCodeAnalysisDependsOn>
        $(RunMergeNativeCodeAnalysisDependsOn);
        CustomOutputNativeCodeAnalysisFile
      </RunMergeNativeCodeAnalysisDependsOn>
    </PropertyGroup>
    
    <Target Name="CustomOutputNativeCodeAnalysisFile">
      <PropertyGroup>
        <OutputCodeAnalysisFile>$(OutDir)$(TargetName).NativeCodeAnalysis.TEST.xml</OutputCodeAnalysisFile>
      </PropertyGroup>
    </Target>
    

有人知道,如何在不触及标准代码分析目标的情况下解决问题?

【问题讨论】:

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


    【解决方案1】:

    不幸的是,我尝试使用您上面确定的相同策略更改单个文件的输出位置,但没有成功。但是,我已成功更改合并文件的位置,这可能是您的问题的解决方法。

    要记住的重要一点是,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 文件后,我将其 Microsoft.Cpp.targets 文件之后包含在我的 .vcxproj 中:

    <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 文件并将合并的输出文件设置为我指定的内容。

    我知道这并没有回答您的问题,但它可能会为您提供在单个位置获取分析结果的替代解决方案。不幸的是,我没有评论的声誉,否则我会将其添加为评论。我希望这个周末能多做一些调查,看看我能不能真正解决你的问题。

    【讨论】:

      【解决方案2】:

      只需更改项目属性中的选项: 右键项目,选择属性 在 Tab Code analysis/General 上,取消选中 Enable Code analysis on Build

      【讨论】:

        【解决方案3】:

        我相信执行此操作(更改/覆盖 MSBuild 项目属性)的最标准方法是使用 Directory.build.props,它允许您在解决方案范围或项目范围级别覆盖 MSBuild 属性 - 基于文件的位置- 至少对于 C++ 和 C#。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-03
          • 1970-01-01
          • 2023-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多