2009-02-13 3 views
13

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

ответ

8

Да, вы можете. В какой-то момент, возможно, в 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"/> 

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

<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 SDC tasks на CodePlex.

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

+0

Как вы вытаскиваете сборку и ревизию из $ (BuildNumber), поскольку она по умолчанию является форматом «MyBuildDefinition_20090213.1»? – Fadeproof

+0

Вы можете написать настраиваемую задачу, чтобы вырезать часть MyBuildDefinition_ и отключить ее. –

9

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

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

Для получения дополнительной информации о том, как я хотел бы сделать это, посмотрите на TFS сборки рецептах вики:

или мой блог на тему

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

Martin.

+0

Спасибо, Мартин. Я уже наткнулся на ваш отличный пост по выравниванию и использовал этот метод. Когда вы говорите, что вам нравится номер известной версии, который будет использоваться в сборках разработчиков, вы подразумеваете, что это будут те из файла информации о сборке без каких-либо переопределений? скажем, 1.0.0.0? – Fadeproof

+0

Для разработчиков вы используете только сборку VS или используете скрипты сборки, которые разработчики должны использовать на своих рабочих станциях? – Fadeproof

+0

Для разработчиков я использую только VS-сборку. Иногда я использую сборку Developer Workstation, используя скрипт TeamBuild, однако VS-сборки, как правило, могут выполнять эту работу в 90% случаев и упрощают работу. В ответ на ваш предыдущий комментарий я действительно использую 1.0.0.0 в файлах AssemblyInfo. –