Visual Studio многократно перестраивает проекты после обновления анализатора кода - PullRequest
0 голосов
/ 24 апреля 2018

Это относится к сообществу Visual Studio 2017. Большая часть нашего процесса сборки предпочитает инструменты VS2015, но была обновлена ​​и для сборки под инструменты VS2017.

  • Допустим, у нас есть проект MyProject.csproj, который ссылается на двоичный файл анализатора кода MyAnalyzer.dll.
  • MyProject - библиотека в нашем решении, на которую часто ссылаются (~ 100 проектов в дереве), и она меняется очень редко.
  • Итак, пришло время добавить новое правило в MyAnalyzer. Мы ставим новую версию в репо, перезаписывая старую.
  • Внезапно MyProject и все, что от него зависит, каждый раз перестраивается!

Диагностическое сообщение, предоставленное Visual Studio:

Проект 'MyProject' не обновлен. Входной файл '.. \ codeanalysis \ bin \ myanalyzer.dll' изменяется после выходного файла ''.

Построение MyProject самостоятельно демонстрирует такое поведение, каждый раз . Но после принудительного перестроения MyProject и предоставления возможности остальным проектам разобраться, проблема исчезает.

До следующего следующего обновления MyAnalyzer, конечно.

  • Visual Studio учитывает время модификации библиотек анализатора кода проекта при определении необходимости сборки.
  • Сборка проекта начнется рано, обнаружив, что сборка не требуется. Разумеется, выходные файлы не будут обновлять свои временные метки.
  • Поэтому Visual Studio будет строить проект каждый раз , в дополнение ко всему, что от него зависит, только чтобы MSBuild сказал «Нет, ничего не делать» около ста раз.
  • Для решения из 100 проектов это может привести к тому, что обычная сборка займет около минуты, тогда как на создание вещей, которые действительно изменились, нужно потратить всего несколько секунд.

MSBuild прекрасно понимает, что ничего не изменилось. Есть ли способ сообщить об этом в Visual Studio? Я знаю, что технически VS здесь верен, но я знаю, что это не так.

1 Ответ

0 голосов
/ 02 мая 2018

В конце концов, похоже, я действительно поступил неправильно. Попытка подавить обнаружение изменений VS неверна, и я должен заставить MSBuild перестроиться при изменении анализатора.

Таким образом, в основном, сделайте так, чтобы поведение обнаружения изменений в MSBuild совпадало с VS, а не наоборот.

Я достиг этого, добавив сборки анализатора как скрытые, фиктивные элементы содержимого в каждый проект, поэтому моя общая ItemGroup теперь выглядит так:

<ItemGroup>
  <Analyzer Include="@(AnalyzerAssemblies)" />
  <Content Include="@(AnalyzerAssemblies)">
    <Private>False</Private>
    <Visible>False</Visible>
  </Content>
</ItemGroup>

Это, похоже, дает желаемый результат, заставляя MSBuild учитывать временную метку анализатора при его вызове VS, что заставляет все решение перестроиться один раз, а затем останавливается.

...