Знает ли MSBuild, нужно ли перекомпилировать проект? - PullRequest
1 голос
/ 19 мая 2009

Во-первых, у меня есть базовое предположение о том, что Visual Studio компилирует вещи со своими файлами по умолчанию. * Proj-файлы, которые, если вы строите одно и то же решение дважды подряд, обнаруживают, что ничего не изменилось, и, кажется, не проходят через сборку решения , Означает ли это, что он знает, что в проекте ничего не изменилось и не должен создавать новый вывод DLL?

Если это так, у меня есть вопрос. Скажем, у меня есть решение с несколькими библиотеками классов и задачей MSBuild в каждом проекте, которая автоматически увеличивает версию сборки путем изменения AssemblyInfo.cs. Дело в том (если мое предыдущее предположение верно), оно делает это каждый раз и запускает новое пересборка каждой библиотеки классов. Есть ли в MSBuild цель или свойство, которое может сказать, нужно ли проекту перекомпиляции, и пропустить мой шаг контроля версий, если так?

Я спрашиваю, потому что, скажем, я обновляю проект A, но не проект B в решении. Если я запускаю сборку решения, я хочу, чтобы он обновил версию в проекте A, но, поскольку проект B не изменился, я хочу оставить его в покое.

Ответы [ 2 ]

1 голос
/ 19 мая 2009

На самом деле не имеет значения, увеличиваете ли вы поле для разработчиков - важно то, что ваша ежедневная сборка / конфигурирование CI увеличивается только при необходимости. Итак, в прошлом я использовал небольшой файл XML, содержащий следующий номер сборки, и попросил задачу MSBuild взять этот файл XML и создать файл с именем Version.cs (содержащий атрибуты управления версиями, которые вы обычно находите в AssemblyInfo.cs).

Version.cs никогда не регистрируется в вашем элементе управления soure - он генерируется сборкой.

Разработчики синхронизируют текущий XML-файл, создают свои двоичные файлы и получают номер текущей версии. Непрерывная интеграция может также делать то же самое. Но ежедневная / официальная сборка будет проверять файл XML, увеличивать информацию о версии, а затем регистрировать ее. С этого момента номер версии официально изменился.

Существуют варианты по этой теме, но общая идея работает.

1 голос
/ 19 мая 2009

Нашел что-то: http://msdn.microsoft.com/en-us/library/ms171483.aspx

MSBuild может сравнивать временные метки входные файлы с отметками времени выходные файлы и определить, пропустить, построить или частично восстановить цель. В следующем примере, если любой файл в элементе @ (CSFile) Коллекция новее, чем hello.exe файл, MSBuild запустит цель; в противном случае оно будет пропущено:

<Csc
    Sources="@(CSFile)" 
    OutputAssembly="hello.exe"/> </Target>

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

...