Как установить выходной путь для журналов анализа собственного кода при запуске MSBUILD в командной строке

Я строю свое решение, используя 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>
    

Кто-нибудь знает, как решить проблему, не касаясь стандартной цели анализа кода?

3 ответа

К сожалению, у меня ничего не получилось в моих собственных попытках изменить местоположение отдельных файлов, используя те же стратегии, которые вы определили выше. Тем не менее мне удалось изменить расположение объединенного файла, что может стать решением проблемы.

Важно помнить, что 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 сгенерированные файлы и установите объединенный выходной файл в то, что я указал.

Я знаю, что это не ответило на ваш вопрос, но может дать вам альтернативное решение для получения результатов анализа в одном месте. К сожалению, у меня нет репутации для комментария, или я бы добавил его как один. Я надеюсь продолжить расследование в эти выходные немного больше и посмотреть, смогу ли я на самом деле решить вашу проблему.

Просто измените параметр в свойствах проекта: щелкните правой кнопкой мыши по проекту, выберите свойства на вкладке Анализ кода / Общие, снимите флажок Включить анализ кода в Build

Я считаю, что наиболее стандартный способ сделать это (изменить/переопределить свойства проекта MSBuild) — использовать Directory.build.props, что позволяет вам переопределять свойства MSBuild на уровне решения или проекта — в зависимости от местоположения файла — по крайней мере для С++ и С#.

Другие вопросы по тегам