Спасибо за предложения. Я решил написать набор пользовательских целей для использования со своим сценарием MSBuild, который поддерживает метаданные сборки в удаленном XML-файле "манифеста". Когда создается новый проект TeamCity, мой скрипт сборки вызывает цель Init, которая создает новый файл манифеста из незаполненного шаблона.
<Copy SourceFiles="@(ManifestTemplate)" DestinationFiles="@(ManifestTemplate->'$(ManifestFile)')" Condition="!Exists('$(ManifestFile)')" />
Я использую пакет MSBuild Extentions для чтения атрибутов, таких как информация о версии, из файла манифеста.
<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="ReadElementText" File="$(ManifestFile)" XPath="/Package/Version/Major">
<Output PropertyName="PackageVersionMajor" TaskParameter="Value"/>
</MSBuild.ExtensionPack.Xml.XmlFile>
У меня есть конфигурации сборки TeamCity, разделенные на CI, Test, Minor Release и Major Release с различными событиями, запускающими каждую. Из соответствующей цели в сценарии сборки моего проекта я добавляю новую цель в атрибут DependsOnTargets
, чтобы вызвать настраиваемую цель, чтобы обновить соответствующий номер версии и сохранить его в файле манифеста.
<Target Name="Test" DependsOnTargets="IntializeBuildProject;Build-UpdateVersion-Build">
<MSBuild Projects="$(SolutionFile)" Targets="Rebuild" Properties="Configuration=$(Configuration)" />
<TeamCitySetBuildNumber BuildNumber="$(PackageVersion)" />
Код в пользовательской цели для обработки обновления версии:
<MSBuild.ExtensionPack.Science.Maths TaskAction="Add" Numbers="$(PackageVersionBuild);1">
<Output PropertyName="PackageVersionBuild" TaskParameter="Result"/>
</MSBuild.ExtensionPack.Science.Maths>
<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="UpdateElement" File="$(ManifestFile)" XPath="/Package/Version/Build" InnerText="$(PackageVersionBuild)"/>
Этот файл обрабатывает сохранение версии и других метаданных, игнорируя таким образом номер сборки TeamCity. Поскольку файл метаданных XML является централизованным, я могу использовать эти значения для заполнения метаданных Nuspec, AssemblyInfo и WiX Installer, а также передавать версию и другую соответствующую информацию обратно в TeamCity через служебные сообщения.
Я добавил простой веб-интерфейс MVC, чтобы позволить моей команде удаленно редактировать содержимое файла при изменении сведений о пакете. Теперь у нас есть единственное место для обновления таких вещей, как информация об авторских правах и любые другие метаданные для данного проекта сборки. Я также могу предоставить не-dev людям доступ к сайту MVC для обновления информации о брендинге, не предоставляя им доступ к моим конфигурациям сборки TeamCity.
За исключением служебных сообщений, используемых для передачи версии в TeamCity, здесь очень мало того, что связано с TeamCity. Мне нравится, когда функциональность в пользовательских целях и сценариях сборки удаляются из TeamCity, когда мы можем перейти к другому решению для управления сборкой. По этой причине я не планирую тратить время на создание плагина TeamCity, но скоро может появиться серия блогов.
Я буду рад предоставить больше кода и дальнейших объяснений всем, кто заинтересован.