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
Теперь можно построить решение.
Вероятно, при перемещении проектов и рефакторингах ссылка могла быть потеряна и больше не нужна.