Выравнивание номеров версий сборки с помощью TFS Buildnumber

Мне интересно, есть ли способ синхронизировать номера сборки (20080213.1) без использования BuildNumberOverrideTarget, где мне нужно было бы создать свой собственный номер сборки? Я в основном хочу использовать встроенный генератор tfs buildnumber по умолчанию/встроенный, но хочу получить к нему доступ, чтобы выровнять с ним свои версии сборки. Можно ли это сделать и разумно ли это сделать таким образом?

Ответы

Ответ 1

То, о чем вы просите, очень разумно, и есть несколько способов добиться этого.

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

Для получения дополнительной информации о том, как мне это нравится, ознакомьтесь с вики-версией TFS Build Recipies:

или мое сообщение в блоге по теме

Надеюсь, что это поможет,

Martin.

Ответ 2

Да, вы можете. В какой-то момент, возможно, в AfterGet, вы можете использовать BuildNumber и создать настраиваемую задачу для обновления файлов AssemblyInfo.cs в исходном коде.

Мы подключились к AfterGet и заставили нашу цель зависеть:

<Target Name="AfterGet" DependsOnTargets="VersionAssemblies" />

Наш объект VersionAssemblies Target извлекает все файлы AssemblyInfo.cs из $(SolutionRoot):

<CreateItem Include="$(SolutionRoot)\**\AssemblyInfo.cs;">
    <Output TaskParameter="Include" ItemName="AssemblyInfos"/>
 </CreateItem>

проверяет их:

<Exec Command="$(TfCommand) checkout &quot;AssemblyInfo.cs&quot; -r"
          WorkingDirectory="$(MSBuildProjectDirectory)\..\sources" ContinueOnError="true"/>

редактирует их и заменяет версию файла $(BuildNumber):

<File.Replace Path="%(AssemblyInfos.FullPath)"
                  NewValue="AssemblyFileVersion(&quot;$(BuildNumber)&quot;)"
                  RegularExpression="AssemblyFileVersion\(\&quot;(\d+.\d+.\d+.\d+)\&quot;\)"
                  IgnoreCase="true"
                  Force="true"/>

а затем проверяет файлы обратно:

<Exec Command="$(TfCommand) checkin /override:&quot;Automated&quot; /comment:&quot;Update AssemblyInfo files to version number $(BuildNumber) - $(NoCICheckinComment) &quot; /noprompt &quot;AssemblyInfo.cs&quot; /recursive"
          WorkingDirectory="$(MSBuildProjectDirectory)\..\sources" ContinueOnError="false"/>

Для замены версий файла я использую задачу File.Replace, которая поставляется с задачами Microsoft > для CodeClex.

Также обратите внимание, что если у вас есть сборка, которая запускается при проверке, при проверке файлов AssemblyInfo.cs, убедитесь, что комментарий включает в себя $(NoCICheckinComment), поскольку это приводит к тому, что TFS не запускает другую сборку, иначе вы закончите в бесконечном цикле сборки.