Подтвердить что ты не робот

Как MSBuild решает, нужно ли перестраивать библиотеку С# или нет?

Как MSBuild решает, нужно ли перестраивать библиотеку (т.е. вызывать csc) или нет, когда она выполняется против файла проекта С#?

Я предполагаю (но хочу подтвердить):

  • Если нет выходного каталога, перестройте (duh:))
  • Если файл С# был изменен, перестройте
  • Если включенный файл с отмеченной копией - всегда был изменен, перестроить
    • Или он достаточно умен, чтобы не перестраивать, а просто скопировать файл в существующий вывод?
  • Если файл с включенным файлом, отмеченным как copy-if-newer, изменился, перестройте
    • Тот же вопрос, что и выше
4b9b3361

Ответ 1

Если вы посмотрите в файле Microsoft.CSharp.targets(файл MSBuild для компиляции проектов С#), то для цели CoreCompile установлен набор входов и выходов. Они используются для проверки зависимостей, чтобы проверить, требуется ли выполнение CoreCompile. Список входных данных включает файлы С#, файлы ресурсов, значок приложения, файл с сильным именем и другие настраиваемые входы, которые вы можете определить.

Если у вас есть решение и запустите MSBuild на нем с включенным диагностическим протоколированием (/v: параметр командной строки diag), вы можете увидеть это сообщение, если выходы обновлены:

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

Файл целей находится в каталоге .NET Framework (C:\windows\Microsoft.NET\Framework\v3.5 or v4.0.30319).

Ответ 2

MSBuild имеет встроенные функции для этого.

Target имеет два свойства: Inputs и Outputs.

Всякий раз, когда Input изменяется или Output старше или отсутствует, выполняется Target.

Ответ 3

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

Насколько я знаю, MSBuild этого не делает. Он всегда восстанавливает (с нуля) все решение/проект. Однако, когда MSBuild вызывается из Visual Studio, временные компиляции сохраняются в папке \obj вашего проекта. Опорожнение этой папки совпадает с перестройкой.

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

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