Visual Studio перестраивает немодифицированные проекты


Итак, как говорится в названии, у меня есть решение VS2010 с ~50 проектами в нем прямо сейчас. Если я внесу изменения в проект "верхнего уровня", на который ничего не ссылается, то VS все равно перестраивает все 50 проектов. Я запускаю Visual Studio 2010 Ultimate без каких-либо дополнений. Я использую ILMerge для объединения всех проектов в один файл.

Я проверил это, проверив временные метки DLL нижнего уровня и увидев, что они действительно перестроены, хотя их код не был тронутый.

я прочитала все ответы и комментарии:

Visual Studio 2008 продолжает перестраивать

Visual studio продолжает строить все

странный VS2010 build глюк происходит в моем решении

причины перестроения проектов C# в Visual Studio

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

я включил "Инструменты > Параметры > проекты и решения > сборка и запуск > только создавать проекты запуска и зависимости от запуска", но без эффекта.

кроме того, если я просто перестрою проект "среднего уровня", который имеет только 8 (in)прямых зависимостей, он все равно построит все 8 проектов, даже если ILMerge не вызывается, и ни один из зависимых проектов не был изменен.

спасибо всем за любое понимание, которое вы можете предоставить.

добавил

чтобы проверить некоторые из предложений, я создал новый проект WinForms с нуля. Затем я создал два новых проекта внутри этого решения. Я скопировал весь код и ресурсы (не файл проекта) из моих двух проектов "самого низкого уровня" в два совершенно новых проекта (я сделал это, сбросив файлы и папки из Проводника в проект в Visual Studio).

самый низкий проект, давайте назовите это B, не ссылается на какой-либо другой проект. Следующий проект, A ссылка B только. Поэтому, как только я добавил необходимые ссылки на .NET и внешние сборки к проектам, тогда решение будет построено.

у меня тогда была моя новая ссылка на проект WinForm A и сделал полную сборку. Итак, цепочка ссылок:

WinForm ->A ->B

Я тогда изменено WinFormтолько и сделал стандартную сборку (F6). Как и прежде, Visual Studio перестроила все три проекта.

после некоторого систематического eleminiation исходных файлов в проекте B я обнаружил, что если я удалил мой Resources.Designer.cs и Resources.resx (и закомментировал код, который использует

14 63

14 ответов:

откройте Инструменты-Параметры, выберите проекты и решения - сборка и запуск в дереве, затем установите "MSBuild project build output verbosity" в диагностику. Это выведет причину для построения проекта, т. е.

проект 'ReferencedProject' не актуален. Элемент проекта 'c:\some.xml 'имеет' копировать в выходной каталог 'атрибут, установленный в 'копировать всегда'.

проект 'MyProject' не актуален. Входной файл 'c:\ReferencedProject.DLL', которые изменяются после выходного файла 'c:\MyProject.ГКБ'.

в этом случае исправление заключается в копировании некоторых.xml только если новее.

события Pre и post build также могут инициировать сборку.

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

у меня изначально было около 5 проектов из 50, которые содержали . Эти проекты всегда будут перестраиваться, и поэтому все, от чего они зависят, также будет перестраиваться. Один из этих 5 проектов был библиотекой "базового" уровня, на которую ссылались 48 других проектов, поэтому 96% моего проекта будут перестраиваться каждый раз, даже если он в этом не нуждается.

мой обходным путем было использование инъекции зависимостей, интерфейсов и выделенного проекта "ресурсы". Вместо того, чтобы эти 5 проектов ссылаются на свои собственные Resources объект, я создал интерфейс в каждом проекте, который будет поставлять необходимые ресурсы. Затем классы, которые нуждались в этих ресурсах, потребовали бы, чтобы интерфейс был передан во время их создания в конструкторе (инъекция конструктора).

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

наконец, в моем проекте "верхнего уровня", на который ничего не ссылается (и где exe был фактически построен, а мой корень композиции живет), я ссылался на проект "ресурсы", подключенный к Ди, и мы ушли.

это означает, что только два проекта ("ресурсы" и "верхний уровень") будут перестраиваться каждый раз, и если я сделаю частичную сборку (Shift-F6), то они вообще не будут перестраиваться.

опять же, не отличная работа, но с 48 проектами, которые строятся каждый раз, когда сборка займет около 3 минут, поэтому я терял от 30 до 90 минут в день с ненужными перестройками. Потребовалось некоторое время для рефакторинга, но я думаю, что это было хорошо инвестиции.

вот упрощенная схема. Обратите внимание, что зависимости от Main.exe до Proj1 и Proj2 не показаны для уменьшения беспорядка.

Diagram of solution

С этим дизайном, я могу сделать сборку Proj1 или Proj2 без запуска полной перестройки, так как они не имеют никаких зависимостей от . Только Main знает о Resources реализация.

Это происходит, когда проект имеет файл, который на самом деле не существует.
Проект не может определить, был ли файл изменен (потому что его там нет), поэтому он перестраивается.

просто посмотрите на все файлы в проекте и найдите тот, который не имеет расширяемой стрелки рядом с ним.

у меня была такая же проблема в VS 2015.

что сделал трюк для меня-это:

  1. один проект ссылался на свою копию в каком-то другом проекте bin (magic, yes). Такие вещи можно найти при переключении на диагностический вывод сборки (в параметрах сборки), а затем при попытке построить проекты один за другим из верхней части иерархии проектов - если вы видите проект, который перестраивается, даже если ничего не было изменено, тогда см. Его ссылки.
  2. я изменилась все" копировать всегда "файлы во всех проектах, чтобы "копировать, если новее". В основном, во всех .csproj файлы заменить <CopyToOutputDirectory>Always</CopyToOutputDirectory> до <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  3. затем я отключил туннелирование NTFS, как описано в этой статья с этим сценарием powershell:

New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "MaximumTunnelEntries" -Value 0 -PropertyType "DWord"

после этого мне нужно было перестроить, и сейчас это работает.

в моем случае виновником был параметр " копировать локально "для указанной dll, установленный в true, и" копировать в выходной каталог", устанавливающий набор файлов для копирования всегда.

Я наконец нашел еще одного виновника, которого мне было трудно найти, увеличив многословие журнала сборки.

в некоторых случаях MSBuild ищет vc120.pdb в выходной папке, и если этот файл не существует, он будет перестроить весь проект. Это происходит даже если вы отключили генерацию символов отладки.

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

вот ответ от VS2010 всегда перестраивает решение?

эта проблема решается путем изменения файлов проекта, раствор для очистки, удаление всех папок bin вручную, перезапуск Visual studio и перестраивая все.

судя по вашим наблюдениям, похоже, что у вас есть проекты, выражающие зависимости от других проектов таким образом, что это не очевидно. Возможно, что потерянные зависимости останутся в файлах проекта, не будучи очевидными в пользовательском интерфейсе. Вы просматривали файл проекта misbehaving после его открытия в текстовом редакторе? Проверено решение построить зависимости?

Если вы не можете ничего обнаружить, попробуйте воссоздать один из ваших проектов с нуля, чтобы увидеть, если новый проект проявляет ту же проблему. Если чистый проект строится правильно, вы будете знать, что у вас есть нежелательные зависимости, выраженные где-то. Насколько я знаю, они должны быть в файле проекта или файле решения, если у вас нет makefiles или других необычных шагов сборки.

У меня были те же проблемы с вами. Я обнаружил, что он пришел из некоторых удаленных файлов. Когда я удалил файлы из своего проекта, проблемы исчезли. С уважением.

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

Если это так, вам нужно будет либо отключить туннелирование NTFS, либо дублировать выходную папку в новое место. вот это в более словах.

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

в этом случае вы можете рекурсивно коснуться всех файлов с помощью git bash (да, в Windows):

find . -exec touch {} \;

команда MSBuild собирает документацию о расследовании проблем инкрементальности сборки здесь: https://github.com/Microsoft/MSBuild/wiki/Rebuilding%20when%20nothing%20changed

У меня была проблема с проектами перестройки Visual Studio при обновлении с Visual Studio 2015 до 2017, и я добавляю этот ответ в интересах тех, кто может испытывать подобные проблемы, поскольку он, похоже, нигде не документирован.

в моем случае проблема заключалась в том, что все проекты в решении имели один и тот же промежуточный выходной путь (obj). Файл GeneratedInternalTypeHelper.cs генерируется всеми проектами, содержащими XAML. До Visual Studio 2015, сборка процесс, по-видимому, не проверял дату файла этого файла и, следовательно, никаких проблем с ним не возникло. С VS2017 проверяется дата файла этого файла, и поскольку более поздний проект в процессе сборки перезапишет его (с тем же содержимым), более ранний проект будет повторно построен, повторно запустив более позднюю сборку, ad infinitum.

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

У меня была такая же проблема, и она оказалась связанной с несколькими проектами, у которых была локальная ссылка на dll в их собственном выходном каталоге.

ключом к поиску этого было наличие диагностического вывода, установленного для вывода сборки, но также зная, что искать в журнале. Ищем:'не в курсе' был ключ.