Причина, по которой проект VS 2008 каждый раз перестраивается

Есть ли способ выяснить причину, по которой проект перестраивается каждый раз при выполнении операции Build Selection в VS 2008?

Я даже пытался удалить все зависимости из Build\Configuration Manager (сняв флажок со столбца сборки для всех сборок, кроме рассматриваемой).

Я получаю тот же результат: сборка каждый раз перестраивается.

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

На самом деле мне не очень понятно, каков алгоритм VS/MSBuild, чтобы решить, следует ли пересобирать проект или нет. Проверяет ли он наличие зависимостей (файлов/сборок), у которых временная метка NTFS последнего доступа новее, чем у рассматриваемой сборки? Может быть, я мог бы попытаться найти «оскорбительный» файл таким образом.


person Florin Sabau    schedule 28.09.2009    source источник
comment
Вы не смешиваете сборку и ссылку? Все проекты перелинковываются, но не пересобираются каждый раз.   -  person Kamarey    schedule 28.09.2009
comment
Нет, это действительно построено каждый раз. Я вижу предупреждения от компилятора, в то время как для других проектов я получаю такие сообщения (для проекта CL): Сборка начата: Проект: CL, Конфигурация: Отладка без лицензии Любой ЦП ------ CL -> D :\Code\magnet5Dev\MagNet\Build\Debug\CL.dll   -  person Florin Sabau    schedule 28.09.2009


Ответы (6)


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

Какой тип проекта у вас есть?

person Frank Bollack    schedule 28.09.2009
comment
Нет событий перед сборкой в ​​рассматриваемом проекте. Но у меня есть события предварительной сборки для некоторых зависимостей. Тип проекта — Библиотека классов. - person Florin Sabau; 28.09.2009

Существует ли круговая зависимость между различными модулями/проектами в вашем приложении?

person Greg D    schedule 28.09.2009
comment
Нет, никаких циклических зависимостей, так как это не поддерживается компилятором. Но у меня есть ссылка на службу WCF, которая также имеет ссылку на ту же родительскую dll (только ссылка на скомпилированную сборку из каталога DLL, а не на ссылку проекта). Тем не менее, те же ссылки находятся в другой ветке, которая отлично компилируется. Проблема может быть связана с этим, так как проблема появилась ок. в то же время были добавлены сервисные ссылки. - person Florin Sabau; 28.09.2009
comment
На самом деле, теперь, когда я дважды проверил, ссылка из службы WCF указывает непосредственно на проект решения (а не на скомпилированную dll). Но обратная ссылка по-прежнему является служебной ссылкой, которая является автономной ссылкой. Он не обновляется автоматически. Так что я подозреваю, что это не проблема. Опять же, проект из другой ветки, в котором также есть эта ссылка, не раскрывает проблему. - person Florin Sabau; 28.09.2009

Если вы изменяете AssemblyInfo.cs с помощью обновленной версии AssemblyFileVersion (как я делаю, например, с Cruise Control .Net), я обнаружил, что это вызывает перестроение.

person Ryu    schedule 28.09.2009
comment
У нас есть один файл AssemblyVersion.cs, который связан с каждым проектом в решении. Он не изменяется и не копируется в событии предварительной сборки, поэтому он не должен запускать перекомпиляцию. Спасибо за Ваш ответ. - person Florin Sabau; 29.09.2009
comment
Да, у меня такая же конфигурация с одним AssemblyInfo.cs. В окне сборки я меняю этот файл, и из-за этого он, кажется, вызывает перестройку. - person Ryu; 29.09.2009
comment
Ну и на билд бокс всегда пересобирается потому что сборок между сборками не остается и думаю желательно чтобы так было. Но на коробке DEV действительно напрягает ждать сборки, даже если она не нужна. - person Florin Sabau; 29.09.2009

Это может быть вызвано неправильной обработкой MSVC 2008 (недавно добавленных) правил предварительной сборки. Выполните очистку, закройте MSVC, удалите файлы .pch и .ncb, снова откройте MSVC и выполните сборку. Это должно исправить ненужную компиляцию.

person James Crook    schedule 18.04.2011

Я не уверен на 100%, но похоже проекты с любыми предупреждениями всегда будут пересобираться.

person leppie    schedule 28.09.2009
comment
Хм, странно, потому что один и тот же проект на другой ветке (не сильно отличающейся, так как сливаются раз в месяц) пересобирается только тогда, когда произошли изменения. Это правда, что у них обоих есть много-много предупреждений. - person Florin Sabau; 28.09.2009
comment
Нет, это не правда. Процесс сборки не зависит от ранее обнаруженных предупреждений. - person Kamarey; 28.09.2009

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

GetLatestVersion (с параметром "перезаписать существующие").

Уже все хорошо.

Еще одна вещь, которую я обнаружил, к сожалению, после того, как я перезаписал локальные файлы проекта версией Workspace: есть опция в Инструменты-Параметры-Проекты и Решение-Сборка и Запуск-MSBuild проект сборки детализации.

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

person Florin Sabau    schedule 29.09.2009