Как остановить Visual Studio от создания зависимостей, которые не изменились?

Название довольно просто. Если я нажму кнопку "Создать", он будет действовать как кнопка "Восстановить все". Если у меня есть два проекта, давайте назовите их PARENT и CHILD, и я сделаю изменения для родителя и нажмите кнопку "Построить". Поведение по умолчанию в VS - это восстановление PARENT AND CHILD, когда он должен только восстанавливать PARENT.

Мне было интересно, если это вариант в Visual Studio и как я могу его изменить.

Спасибо.

Ответ 1

В вашем вопросе, по-видимому, есть некоторые несоответствия, поэтому я хочу определить термины, которые я использую, для ясности.

  • Сборка: Скомпилировать и связать все, что требуется для приложения/проекта
  • Очистить: удалить все файлы, созданные как часть сборки.
  • Перестроить: выполнить чистый, а затем построить.

У моей Visual Studio нет кнопки '(Re) build All', однако у нее есть кнопка '(Re) build Solution', поэтому я собираюсь предположить, что вы имеете в виду это. Я также собираюсь предположить, что там, где вы сказали rebuild PARENT and CHILD, вы имели в виду build PARENT and CHILD и что он не перекомпилировал каждый файл в проекте.

Параметры сборки и сборки не совпадают.

  • Выполнение сборки будет оценивать текущий проект (и его зависимости), компилируя все, что требуется.
  • Выполнение решения сборки будет оценивать проекты all в решении, компилируя все, что требуется.

Итак, если у вас есть решение с тремя проектами:

  • Ребенок
  • Служба (зависит от ребенка)
  • FrontEnd

Затем, если выбранным в настоящий момент проектом является Service:

  • Сборка: оценил бы/скомпилировал: Ребенок и Сервис
  • Build Solution: оценит/скомпилирует: Child, Service и FrontEnd

Теперь я считаю, что вы видите, что когда вы выполняете сборку на Parent, VS также выполняет сборку на Child, даже если она не изменилась. Я бы ожидал, что он оценивает Ребенка, потому что ему нужно знать, изменилось ли оно. Не выполняя оценку, ее невозможно узнать, поэтому в окне вывода вы увидите, что она что-то сделала с проектом Child. Обычно это довольно быстро, хотя он и складывается, если у вас много зависимостей.

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

Некоторые параметры:

  • Разгрузите дочерние проекты, которые вы не меняете (щелкните правой кнопкой мыши в проводнике решений и выберите выгрузить). Это скрывает зависимость, поэтому она не компилируется).
  • Остановить возможность визуальной студии управлять вашими зависимостями. Самый безопасный способ сделать это - удалить ссылки на основе проекта и вместо этого использовать ссылки на основе Binary Based (указать на скомпилированный вывод из каждой зависимости). Но это может быть нетривиальное обязательство, поскольку вам нужно самостоятельно управлять своим проектом.

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

Ответ 2

Щелкните правой кнопкой мыши по Решение из Обозревателя решений, выберите Свойства.

Из свойств конфигурации > Конфигурация вы можете исключить конкретный проект из процесса сборки

В разделе Общие свойствa > Задания проекта вы можете создавать и удалять зависимости проекта

Надеюсь, что это поможет...

Расширения Muse

Ответ 3

У меня была аналогичная проблема с примерно 40 проектами в одном решении. Для меня следующая настройка была намного менее опасной, чем другие ответы.

  • В Visual Studio откройте Configuration Manager из меню Сборка.
  • Выделите < Создать... > из Конфигурация активного решения.
  • Введите Имя (например, интерфейс отладки) и либо скопируйте настройки, либо создайте пустую конфигурацию. Вы должны быть в безопасности, чтобы отменить выбор Также создать новую конфигурацию проекта, особенно если вы хотите уменьшить время сборки.
  • Выберите или отмените выбор проектов, которые вы хотите построить, с новой конфигурацией, а затем закройте диспетчер конфигурации.
  • Наслаждайтесь более коротким временем сборки с помощью Ctrl + Shift + B или просто создавая родительский проект. Но не забудьте перейти на другую конфигурацию сборки, если хотите, чтобы все проекты были построены снова. Другие проекты, которые вы выбрали, могут быть построены, если вы щелкните их правой кнопкой мыши и выберите Построить.

Более подробную информацию о Configuration Manager можно найти в MSDN: Диалоговое окно Configuration Manager.

Ответ 4

Прочитайте эту статью:

http://blogs.msdn.com/b/kirillosenkov/archive/2014/08/04/how-to-investigate-rebuilding-in-visual-studio-when-nothing-has-changed.aspx

[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12,0\General] "U2DCheckVerbosity" = dword: 00000001

При настройке раздела реестра (я должен был добавить его) просто используйте версию визуальной студии, которая применима к вам. Например. 14.0 == VS2015

Диагностика, которая была представлена, может помочь вам определить, почему msbuild считает, что вещи устарели.

Ответ 5

У меня также была эта проблема с С++. Зависимые проекты полностью перекомпилируются, даже если я не изменил их исходный код или файлы заголовков.

Я отключил "Оптимизацию всей программы" для всех зависимых проектов. Теперь мои проекты восстанавливаются только при изменении исходного кода. Этот параметр для проектов на С++ можно найти в свойствах → Свойства конфигурации → Общие.

Удача

Ответ 6

Alt + B, U создаст только ваш текущий проект. Хороший ярлык, если вы не хотите создавать все проекты в решении.

Ответ 7

Я только что видел такую ​​ситуацию в решении с несколькими сотнями проектов. Всякий раз, когда вы нажимаете "build", VS будет перестраивать большинство проектов, даже если вы только что сделали полную сборку еще секунду назад. Такая же проблема, если вы хотите создать только один проект.

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

Это касается только ссылок на проекты. VS не мешает вам добавлять, скажем ../Debug/bin/OtherSubProject.dll как ссылку на DLL.

Теперь предположим, что у нас есть решение со 100 проектами, большинство из которых, скажем, зависят от CoreLibrary.dll. Предположим, кто-то добавляет ссылку от CoreLibrary.dll до ProjectX.dll (игнорируя тот факт, что ProjectX уже зависит от CoreLibrary).

Если мы запустим сборку сейчас, сначала построим CoreLibrary.dll, затем ProjectX.dll и все другие проекты.

Теперь предположим, что мы снова запустим сборку, ничего не меняя. VS видит, что одна из зависимостей CoreLibrary.dll, а именно ProjectX.dll более новая, чем CoreLibrary.dll, и, следовательно, CoreLibrary.dll необходимо перестроить. Но, конечно, восстановление основной библиотеки заставляет перестраивать все другие проекты, в том числе ProjectX.dll (который снова будет более новым, чем CoreLibrary.dll).

Способ решения этой проблемы состоит в том, чтобы избавиться от всех круговых зависимостей, что, в частности, означает, что вы не должны ссылаться на свои другие подпроекты через ссылки DLL. Временное решение, в то время как вы это сделаете, - это перейти к Свойствам решения → Конфигурация и просто отключить построение для одного из проектов в цикле (либо CoreLibrary.dll или ProjectX.dll в примере выше).

Существует еще одна распространенная причина, по которой VS может перестраивать проекты, которые не были изменены: статические файлы с параметрами "Скопировать в выходной каталог: всегда" в их свойствах. Избегайте их.

Наконец, чтобы отладить все это и выяснить, что вызывает перестройки, откройте "Инструменты- > Параметры- > Проекты и решения- > " Сборка и запуск "и включите вывод" Диагностика "для MSBuild. Затем выполните поиск слов" не обновляется" в окне вывода при построении решения.