Visual Studio многократно перестраивает проекты после обновления анализатора кода
Это относится к сообществу 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 ответ
В конце концов, похоже, я действительно поступил неправильно. Попытка подавить обнаружение изменений VS неверна, и я должен заставить MSBuild перестроиться при изменении анализатора.
В общем, сделайте так, чтобы поведение обнаружения изменений в MSBuild совпадало с VS, а не наоборот.
Я достиг этого, добавив сборки анализатора как скрытые, фиктивные элементы содержимого в каждый проект, поэтому моя общая ItemGroup теперь выглядит так:
<ItemGroup>
<Analyzer Include="@(AnalyzerAssemblies)" />
<Content Include="@(AnalyzerAssemblies)">
<Private>False</Private>
<Visible>False</Visible>
</Content>
</ItemGroup>
По-видимому, это приводит к желаемому результату, заставляя MSBuild учитывать временную метку анализатора при ее вызове VS, что заставляет все решение перестроиться один раз, а затем устанавливается.