Моя ситуация
В проекте С#, над которым я сейчас работаю, мы имеем довольно большое решение (80+ проектов). Теперь время перестройки 5 минут + действительно становится проблемой с использованием MSBuild из Visual Studio 2008.
В анализе, который я сделал на прошлой неделе, выяснилось, что мое время сборки было потрачено следующим образом:
-
Копирование файлов в проекты и их повторение с проектами, которые зависят от него (CopyToLocal) и т.д. (60%)
-
Вызов постройки для декомпиляции/компиляции. (20%)
-
Выполнение фактической компиляции и т.д. (20%)
Помимо вывода "нормального" проекта bin\debug
вывод папок также копируется во внешний каталог для настройки основной программы "загрузчик". Основная структура программы немного похожа на это:
\loader\bin\loader.exe
\loader\plugin\plugin1\plugin1.dll
\loader\plugin\plugin1\somedependency.dll
Что я сделал
В попытке сделать вещи немного быстрее, я подумал о следующем:
-
Скопируйте все файлы в один большой каталог bin и не используйте CopyTolocal. Мне это не нравится, потому что мы больше не можем использовать разные версии тех же DLL файлов, и мой каталог bin становится довольно беспорядочным.
-
Используйте parallelism (/m) для MSBuild. Это помогает лишь очень мало времени сборки.
-
Попробуйте уменьшить зависимости между проектами, что всегда хорошо.
-
Инвестируйте в оборудование. Я нашел несколько исследование твердотельных накопителей, но это не кажется многообещающим.
Мой вопрос
Я также заметил, что когда я вношу изменения в проект, который находится в корне моего дерева зависимостей, все восстанавливается. Даже если изменение было только в части 'private', и интерфейс проекта не изменился.
Использует ли MSBuild временную метку зависимых проектов, чтобы определить, нуждается ли проект в восстановлении?
Может ли это быть изменено на другое условие? Например, контрольная сумма файла?
Помимо этого конкретного предложения, я был бы очень признателен за все предложения по ускорению сборки.