Visual Studio (2012, 2015) восстанавливает проект, хотя ничего не изменилось

У меня довольно большое решение (около 50 проектов, все С#), которые я создаю в VS 2012 (обновление 4). Я заметил, что после завершения полной перестройки из VS, непосредственно за которой следует сборка (нажатие F6), один проект перестраивается, хотя я ничего не трогал.

Второй вызов сборки правильно определяет, что все проекты обновлены.

Установка вывода msbuild для диагностики и проверки вывода первого вызова сборки показывает следующее:

NuGet package restore started.
Restoring NuGet packages for solution XXX.
[... some boring lines on NuGet Package restore]
All packages are already installed and there is nothing to restore.
NuGet package restore finished.
Project 'YYY' is not up to date. Last build was with unsaved files.
------ Build started: Project: YYY, Configuration: Debug Any CPU ------
Build started 21-11-2013 21:20:54.

Я особенно заинтригован сообщением, что Project 'YYY' is not up to date. Last build was with unsaved files. у меня нет несохраненных файлов. Интересно, что как Google, так и Bing не дают ни единого удара при поиске этого сообщения.

Любые подсказки о том, что может это сделать? Как я могу отладить эту часть процесса сборки? Я полагаю, что эта часть процесса сборки еще до вызова MsBuild (по крайней мере, новые функции восстановления пакета NuGet появляются до вызова MsBuild, я считаю, что MsBuild запускается из строки "Build started".

Ответ 1

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

Ответ 2

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

Создайте свое решение и выполните поиск в панели вывода сборки для:

Done executing task "Copy"

Чуть выше этой строки вы увидите такие строки:

Did not copy from file
Copying file from 

Вы увидите такие строки:

3>  Copying file from "C:\Projects\test\Business.Core.Mto\bin\Debug\Business.Core.Mto.dll" to "bin\Debug\Business.Core.Mto.dll". (TaskId:68)

Вы можете игнорировать копирование не-dll файлов

Перейдите в исходную строку, содержащую исполняемую задачу Done "Копировать".

Теперь вы увидите следующую строку:

3>Done building target "_CopyFilesMarkedCopyLocal" in project "Business.Core.Utils.csproj".: (TargetId:138)

В Visual Studio откройте ссылки в этом проекте. Удалите все ссылки и добавьте их обратно. Вы можете получить сообщение:

A reference to business.core.mto could not be added. Adding this project as a reference would cause a circular dependency

Теперь можно построить решение.

Вероятно, при перемещении проектов и рефакторингах ссылка могла быть потеряна и больше не нужна.