Отключить анализ кода для некоторых проектов с использованием MSBuild

Я унаследовал файл решения, который использует MSBuild script для компиляции нескольких решений. Большинство проектов сконфигурированы с помощью анализа и наборов правил, и у меня есть несколько проектов с единичным тестированием, которые этого не делают.

Проекты с анализом:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
  <DebugSymbols>true</DebugSymbols>
  <DebugType>full</DebugType>
  <DefineConstants>CODE_ANALYSIS;DEBUG;TRACE</DefineConstants>
  <Optimize>false</Optimize>
  <OutputPath>bin\Debug</OutputPath>
  <PlatformTarget>x86</PlatformTarget>
  <CodeAnalysisRuleSet>..\OurRules.ruleset</CodeAnalysisRuleSet>
  <RunCodeAnalysis>true</RunCodeAnalysis>
 </PropertyGroup>

Проекты с анализом отключены:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
  <DebugSymbols>true</DebugSymbols>
  <DebugType>full</DebugType>
  <DefineConstants>DEBUG;TRACE</DefineConstants>
  <Optimize>false</Optimize>
  <OutputPath>bin\Debug</OutputPath>
  <PlatformTarget>x86</PlatformTarget>
  <RunCodeAnalysis>false</RunCodeAnalysis>
 </PropertyGroup>

Когда я запускаю свою сборку script, похоже, что некоторые проекты не соответствуют настройкам проекта:

msbuild.exe BuildScript.proj /p:SolutionRoot=%cd%; /p:Configuration=Debug /p:Platform:x86 /p:RunCodeAnalysis=True

Когда я проверяю выходную папку, я вижу результаты анализа xml для анализа проектов, для которых флаг RunCodeAnalysis установлен в false. Может кто-нибудь помочь мне понять, что здесь происходит?

Ответ 1

Я понял это вскоре после публикации.

Team Build поддерживает следующие значения для RunCodeAnalysis: Always, Default, Never.

В отличие от этого локально MSBuild поддерживает True или False для RunCodeAnalysis.

Почему они разные? При просмотре файла Microsoft.TeamFoundation.Build.targets появляется следующее сообщение:

<Target Name="CoreCompileSolution">
   <PropertyGroup>
     <CodeAnalysisOption Condition=" '$(RunCodeAnalysis)'=='Always'">RunCodeAnalysis=true</CodeAnalysisOption>
     <CodeAnalysisOption Condition=" '$(RunCodeAnalysis)'=='Never'">RunCodeAnalysis=false</CodeAnalysisOption>
   ...
   </PropertyGroup>
   ...
</Target>

Эти параметры затем передаются в процесс msbuild, когда он компилирует файл решения.

Итак, другими словами:

Всегда сообщает MSBuild компилировать все проекты с помощью RunCodeAnalysis = True

Никогда говорит MSBuild о том, чтобы подавлять анализ кода (RunCodeAnalysis = False) для всех проектов.

... и не указывая значение для RunCodeAnalysis, означает, что MSBuild будет соблюдать параметр RunCodeAnalysis в файле проекта. Следовательно, параметр по умолчанию.

Просто удаление /p: RunCodeAnalysis из моего исходного вопроса имеет правильный результат. Проекты, в которых включен анализ, будут выполнять анализ кода. Проекты без настройки не выполняют никакой дополнительной работы.

Более подробную информацию об этом можно найти здесь: http://www.bryancook.net/2011/06/build-server-code-analysis-settings.html

Ответ 2

Изменить:

<RunCodeAnalysis>false</RunCodeAnalysis>

To:

<RunCodeAnalysis>Never</RunCodeAnalysis>

... и посмотрите, решит ли это вашу проблему. Допустимые значения для RunCodeAnalysis: {Default, Always, Never} или {True, False}, в зависимости от того, как вы строите.

Подробнее см. в пункте 12 раздела Как изменить тип сборки.

Также см. эту статью для несоответствий в настройках RunCodeAnalysis в зависимости от того, как вы создаете: Непоследовательные значения RunCodeAnalysis