Заставить TeamCity интегрировать номер сборки Subversion в версию сборки - PullRequest
20 голосов
/ 08 января 2010

Я хочу настроить вывод из моей конфигурации сборки TeamCity моей библиотеки классов так, чтобы созданные dll-файлы имели следующий номер версии: 3.5.0.x, где x - это номер редакции subversion, который выбрал TeamCity.

Я обнаружил, что могу использовать переменную окружения BUILD_NUMBER, чтобы получить x, но, к сожалению, я не понимаю, что еще мне нужно сделать.

Все «учебники», которые я нахожу, говорят «Вы просто добавляете это в скрипт», но они не говорят «1006 *, какой скрипт», а «это» обычно относится к задаче AssemblyInfo из MSBuild. Расширения сообщества.

Нужно ли как-то создавать собственный скрипт MSBuild, чтобы использовать это? Является ли «скрипт» таким же, как файл решения или файл проекта C #?

Я почти ничего не знаю о процессе MSBuild, за исключением того, что могу передать файл решения непосредственно в MSBuild, но мне нужно добавить в «сценарий» XML, а файл решения определенно не выглядит как XML.

Итак, кто-нибудь может подсказать мне пошаговое руководство о том, как заставить это работать?


Вот чем я закончил:

  1. Установить Задачи сообщества MSBuild
  2. Отредактируйте файл .csproj моей базовой библиотеки классов и измените нижнюю часть так, чтобы она гласила:

    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
    <Target Name="BeforeBuild">
      <AssemblyInfo Condition=" '$(BUILD_NUMBER)' != '' "
          CodeLanguage="CS"
          OutputFile="$(MSBuildProjectDirectory)\..\GlobalInfo.cs"
          AssemblyVersion="3.5.0.0"
          AssemblyFileVersion="$(BUILD_NUMBER)" />
    </Target>
    <Target Name="AfterBuild">
    

  3. Измените все мои файлы AssemblyInfo.cs, чтобы они не указывали ни AssemblyVersion, ни AssemblyFileVersion (ретроспективно, я рассмотрю вопрос о том, чтобы вернуть AssemblyVersion обратно)

  4. Добавлена ​​ссылка на теперь глобальный GlobalInfo.cs, который находится за пределами всего проекта
  5. Убедитесь, что этот файл собран один раз, чтобы у меня был файл по умолчанию в управлении исходным кодом

Теперь это будет обновлять GlobalInfo.cs, только если установлена ​​переменная среды BUILD_NUMBER, как это происходит при сборке через TeamCity.

Я выбрал сохранение постоянной AssemblyVersion, чтобы ссылки продолжали работать, и обновлял только AssemblyFileVersion, чтобы я мог видеть, из какой сборки создана dll.

Ответы [ 2 ]

18 голосов
/ 08 января 2010

Файл CSPROJ фактически является файлом MSBuild.

Выгрузите соответствующий проект класса в VS.NET, отредактируйте его и раскомментируйте цель BeforeBuild. Добавьте задачу FileUpdate MSBuild из расширений MSBuild Community.

В своем файле MSBuild вы можете получить BUILD_NUMBER из TeamCity, используя переменную среды $(build_vcs_number_1). Обратите внимание, что вы можете создать дополнительную Конфигурацию для «Производства», для которой «проверяется условие», так как это, очевидно, не будет работать при локальной сборке.

Просто используйте это как входные данные для свойства ReplacementText задачи FileUpdate.

Обратите внимание, что если номера ваших ревизий превышают отметку 65535 (UInt16), вы не можете использовать их в атрибуте AssemblyVersion.

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

В качестве альтернативы, вы можете придумать способ (a.b.c.d - номер вашей версии) использования revision div 1000 для c и revision mod 1000 для d.

12 голосов
/ 09 декабря 2011

В TeamCity 6.5 это ОЧЕНЬ ПРОСТО для использования AssemblyInfo patcher .

  • Перейдите к шагу 3 настройки сборки "Шаги сборки";
  • Нажмите «Добавить функцию сборки»;
  • Выберите тип объекта "AssemblyInfo Patcher";
  • Укажите, что вы хотели бы в качестве версии. Я использую: %system.build.number%
...