Знает ли MSBuild, нужно ли перекомпилировать проект?
Во-первых, у меня есть базовое предположение о том, как смотреть, как Visual Studio компилирует вещи со своими файлами по умолчанию.* Proj, что, если вы строите одно и то же решение два раза подряд, он обнаруживает, что ничего не изменилось, и, похоже, проходит через сборку решения. Означает ли это, что он знает, что ничего не изменилось в проекте и не должен создавать новый вывод DLL?
Если это так, у меня есть вопрос. Скажем, у меня есть решение с несколькими библиотеками классов и задача MSBuild в каждом проекте, которая автоматически увеличивает версию сборки путем изменения AssemblyInfo.cs. Дело в том (если мое предыдущее предположение верно), он делает это каждый раз и запускает новое пересборка каждой библиотеки классов. Есть ли в MSBuild цель или свойство, которое может сказать, нужна ли проекту перекомпиляция, и пропустить мой шаг контроля версий, если так?
Я спрашиваю, потому что, скажем, я обновляю проект A, но не проект B в решении. Если я запускаю сборку решения, я хочу, чтобы он обновил версию в проекте A, но, поскольку проект B не изменился, я хочу оставить его в покое.
2 ответа
На самом деле не имеет значения, увеличиваете ли вы размер окна разработчика - важно то, что ежедневная сборка CI увеличивается только при необходимости. Итак, в прошлом я использовал небольшой файл XML, содержащий следующий номер сборки, и попросил задачу MSBuild взять этот файл XML и создать файл с именем Version.cs (содержащий атрибуты управления версиями, которые вы обычно находите в AssemblyInfo.cs).
Version.cs никогда не регистрируется в вашем элементе управления soure - он генерируется сборкой.
Разработчики синхронизируют текущий XML-файл, строят свои двоичные файлы и получают номер текущей версии. Построение непрерывной интеграции также может делать то же самое. Но ежедневная / официальная сборка будет проверять файл XML, увеличивать информацию о версии, а затем регистрировать ее. С этого момента номер версии официально изменился.
Есть вариации на эту тему, но общая идея работает.
Нашел что-то: http://msdn.microsoft.com/en-us/library/ms171483.aspx
MSBuild может сравнивать временные метки входных файлов с временными метками выходных файлов и определять, следует ли пропустить, построить или частично перестроить цель. В следующем примере, если какой-либо файл в коллекции элементов @(CSFile) новее, чем файл hello.exe, MSBuild запустит цель; в противном случае оно будет пропущено:
<Csc Sources="@(CSFile)" OutputAssembly="hello.exe"/> </Target>
... это сработало. Но потом заставил меня задуматься, а что если кто-то вытащит код из системы контроля версий без сборок (как мы это делаем)? Поскольку у него нет выходных данных для сравнения, он все равно скомпилирует и увеличит версию. Я думаю, что сложности могут заставить меня отказаться от этого подхода.