Мне интересно, есть ли способ синхронизации номеров сборки (20080213.1) без использования BuildNumberOverrideTarget, где мне нужно было бы создать собственный номер сборки? Я в основном хочу использовать встроенный генератор tfs buildnumber по умолчанию/встроенный, но хочу получить к нему доступ, чтобы выровнять с ним свои версии сборки. Можно ли это сделать, и разумно ли это сделать так?Выравнивание номеров версий сборки с помощью TFS Buildnumber
ответ
Да, вы можете. В какой-то момент, возможно, в 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 "AssemblyInfo.cs" -r"
WorkingDirectory="$(MSBuildProjectDirectory)\..\sources" ContinueOnError="true"/>
редактирует их и заменяет версию файла на $ (Buil dNumber):
<File.Replace Path="%(AssemblyInfos.FullPath)"
NewValue="AssemblyFileVersion("$(BuildNumber)")"
RegularExpression="AssemblyFileVersion\(\"(\d+.\d+.\d+.\d+)\"\)"
IgnoreCase="true"
Force="true"/>
, а затем проверяет файлы обратно в:
<Exec Command="$(TfCommand) checkin /override:"Automated" /comment:"Update AssemblyInfo files to version number $(BuildNumber) - $(NoCICheckinComment) " /noprompt "AssemblyInfo.cs" /recursive"
WorkingDirectory="$(MSBuildProjectDirectory)\..\sources" ContinueOnError="false"/>
Для замены версий файлов я использую задачу File.Replace, которая поставляется с Microsoft SDC tasks на CodePlex.
Также обратите внимание, что если у вас есть сборка, которая запускается при проверке, при проверке файлов AssemblyInfo.cs, убедитесь, что комментарий включает в себя $ (NoCICheckinComment), поскольку это приводит к тому, что TFS не запускает другую сборку, ll заканчиваются бесконечным циклом сборки.
То, о чем вы просите, очень разумно и существует ряд способов достижения этого.
Лично я когда-либо делаю это, я не хочу проверять файлы на контроль версий, у которых в них есть сгенерированный номер сборки, - это просто вводит слишком много головных болей при слиянии кода между ветвями, но также мне нравится известный номер версии, который будет использоваться, когда разработчик создает сборку рабочей станции и сборку собственного сервера сборки, чтобы сделать их очень просто отличить друг от друга.
Для получения дополнительной информации о том, как я хотел бы сделать это, посмотрите на TFS сборки рецептах вики:
или мой блог на тему
Надеюсь, что это поможет,
Martin.
Спасибо, Мартин. Я уже наткнулся на ваш отличный пост по выравниванию и использовал этот метод. Когда вы говорите, что вам нравится номер известной версии, который будет использоваться в сборках разработчиков, вы подразумеваете, что это будут те из файла информации о сборке без каких-либо переопределений? скажем, 1.0.0.0? – Fadeproof
Для разработчиков вы используете только сборку VS или используете скрипты сборки, которые разработчики должны использовать на своих рабочих станциях? – Fadeproof
Для разработчиков я использую только VS-сборку. Иногда я использую сборку Developer Workstation, используя скрипт TeamBuild, однако VS-сборки, как правило, могут выполнять эту работу в 90% случаев и упрощают работу. В ответ на ваш предыдущий комментарий я действительно использую 1.0.0.0 в файлах AssemblyInfo. –
Как вы вытаскиваете сборку и ревизию из $ (BuildNumber), поскольку она по умолчанию является форматом «MyBuildDefinition_20090213.1»? – Fadeproof
Вы можете написать настраиваемую задачу, чтобы вырезать часть MyBuildDefinition_ и отключить ее. –