Как MSBuild проверяет, обновляется ли цель или нет?

MSBuild испускает следующее сообщение для актуальных целей:

Skipping target "MyTarget" because all output files are up-to-date with respect to the input files.

Как выполняется фактическая проверка?

Ответ 1

Проверить поток Incremental Build:

Целевой элемент может иметь как атрибут Inputs, который указывает какие объекты целевой > ожидает в качестве входных данных, а также атрибут Outputs, который указывает, какие элементы он производит в качестве выходных MSBuild пытается найти отображение 1 к 1 между значениями этих атрибутов. Если существует отображение 1-к-1, MSBuild сравнивает отметку времени каждого элемента ввода с меткой времени его соответствующего элемента вывода. Выходные файлы, которые не имеют 1-к-1 сопоставление сравнивается со всеми входными файлами. Рассматривается предмет если его выходной файл имеет тот же возраст или старше его ввода файла или файлов.

Если все выходные данные обновлены, MSBuild пропускает цель. Эта инкрементная сборка цели может значительно улучшить сборку скорость. Если только некоторые файлы обновлены, MSBuild выполняет целевую но пропускает обновленные предметы и тем самым приносит все предметы своевременно. Это называется частичной инкрементной сборкой.

Ответ 2

MSBuild сравнивает временные метки входных и выходных файлов, чтобы определить, обновляется ли файл. Подробнее см. Инкрементальные сборки.