Как отключить анализаторы Roslyn при использовании msbuild из командной строки?

Анализаторы Roslyn устанавливаются как пакеты nuget, которые являются зависимостями анализаторов FxCop (также устанавливаются как пакеты nuget).

Я включил полный анализ решения, как указано здесь: Как включить и отключить полный анализ решения для управляемого кода.

У меня есть довольно большое решение, в котором большинство проектов используют анализаторы FxCop / Roslyn, а Visual Studio отлично собирает, обычно менее чем за минуту.

Однако при запуске msbuild через командную строку с помощью:

"C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/MSBuild/15.0/Bin/MSBuild.exe" "C:\Source\MySolution\MySmartClient.sln" /p:Configuration=Develop;Platform="Any CPU" /
t:Build

Создание решения занимает от 4 до 15 минут. То же самое и на сервере сборки, который использует ту же команду.

Я пробовал /p:RunCodeAnalysis=False, и это не помогло. Я также использовал монитор процессов для имитации команды msbuild, которую VS отправляет в msbuild без изменений.

И, согласно этому документу: Как: включить и отключить автоматический анализ кода для управляемого кода

Флажок «Включить анализ кода при сборке» влияет только на статический анализ кода. Это не влияет на анализаторы кода Roslyn, которые всегда выполняются при сборке, если вы установили их как пакет NuGet.

Такое чрезмерное время сборки непрактично. Есть ли способ отключить при использовании msbuild через командную строку?


person Rich    schedule 07.06.2019    source источник
comment
Связанный: stackoverflow.com/a/57144221/736079   -  person jessehouwing    schedule 23.07.2019


Ответы (3)


На самом деле это не поддерживается, но есть обходной путь:

Создайте файл Directory.Build.targets (msbuild ›= v15.0), After.{SolutionName}.sln.targets (msbuild‹ 15.0) в корневой папке вашего решения и добавьте:

<Project>
  <Target Name="DisableAnalyzers" 
           BeforeTargets="CoreCompile" 
           Condition="'$(UseRoslynAnalyzers)' == 'false'"> 
    <!-- 
       Disable analyzers via an MSBuild property settable on the command line. 
    --> 
    <ItemGroup> 
      <Analyzer Remove="@(Analyzer)" /> 
    </ItemGroup> 
  </Target> 
</Project>

Теперь вы можете перейти /p:UseRosynAnalyzers=false, чтобы удалить все анализаторы, настроенные в проекте.

Смотрите также:

Вы можете изменить условие, чтобы оно также срабатывало на RunCodeAnalysis=False или Never.

<Target Name="DisableAnalyzers" 
        BeforeTargets="CoreCompile" 
        Condition="
           '$(UseRoslynAnalyzers)' == 'false' 
           or '$(RunCodeAnalysis)' == 'false' 
           or '$(RunCodeAnalysis)' == 'never'" >

Чтобы отключить конкретный анализатор, воспользуйтесь такой уловкой:

Мы потратили 2 часа на то, чтобы выяснить, как отключить анализатор на основе свойства MSBuild, AMA.

https://twitter.com/Nick_Craver/status/1173996405276467202?s=09

введите здесь описание ссылки

person jessehouwing    schedule 26.07.2019
comment
Мне не удалось заставить работать метод Directory.Build.targets, но мне удалось добавить цель в файл .csproj. - person Sam Sippe; 31.03.2020

Документация изменилась с момента первоначальных ответов. Теперь существует эта страница, на которой описывается, как чтобы отключить анализ кода из анализаторов:

Есть 3 свойства MSBuild, которые вы можете использовать для управления поведением анализатора (все по умолчанию имеют значение true):

  • RunAnalyzersDuringBuild Управляет запуском анализаторов во время сборки.
  • RunAnalyzersDuringLiveAnalysis Контролирует, будут ли анализаторы анализировать код в реальном времени во время разработки.
  • RunAnalyzers Отключает анализаторы как во время сборки, так и во время разработки. Это свойство имеет приоритет над RunAnalyzersDuringBuild и RunAnalyzersDuringLiveAnalysis.

Изменить: похоже, что отслеживается проблема, где эти реквизиты не работают, если только в ваш проект включен Microsoft.CodeAnalysis.targets. Таким образом, ваш пробег может измениться, пока это не будет исправлено.

person RyanY    schedule 13.05.2020

Если кто-то еще окажется здесь, я столкнулся с этой проблемой в проекте dotnet / roslyn на Github:

Функция: переключатель MSBuild для включения / выключения анализа # 23591

Предыдущая проблема описывает обходной путь:

Заменить старые свойства MSBuild? # 1431

<PropertyGroup>
    <RunCodeAnalysis Condition="'$(RunCodeAnalysis)' == ''">true</RunCodeAnalysis>
</PropertyGroup>
<ItemGroup>
    <PackageReference Include="<whatever analyzers package you are depending on>" Condition="'$(RunCodeAnalysis)' == 'true'" />
</ItemGroup>
# You'll need to run a restore when changing this value
msbuild /p:RunCodeAnalysis=false

Хотя у меня было несколько отличий, поскольку я не использую ссылки на пакеты. Это сработало для меня.

<ItemGroup>
    <Analyzer Include="<whatever analyzers package you are depending on>" Condition="'$(RunCodeAnalysis)' == 'true'" />
</ItemGroup>

<!-- I added the condition to the EnsureNugetPackageBuildImports too. -->
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="'$(RunCodeAnalysis)' == 'true' AND !Exists('<relative path to the prop of whatever analyzers you are depending on>')" Text="$([System.String]::Format('$(ErrorText)', '<relative path to the prop of whatever analyzers you are depending on>'))" />
</Target>
person Rich    schedule 10.06.2019