0

我在命令行上使用 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文件中来使用目标注入<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 回答 3

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

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

于 2015-06-05T03:54:44.213 回答
0

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

在 Directory.build.props 中启用 Clang-Tidy 和代码分析的屏幕截图

于 2021-01-08T13:36:17.363 回答
0

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

于 2019-05-06T02:19:10.483 回答