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生成されたファイルが取得され、マージされた出力ファイルが指定したものに設定されました。

これがあなたの質問に答えていないことは承知していますが、分析の結果を 1 つの場所で取得するための別の解決策が得られる可能性があります。残念ながら、私にはコメントに対する評判がありません。今週末、この一連の調査をもう少し進めて、実際に問題を解決できるかどうかを確認したいと思っています。

于 2015-06-05T03:54:44.213 に答える