Версии сборки с использованием CruiseControl.net - PullRequest
10 голосов
/ 13 января 2009

Я настроил CruiseControl.net для нескольких моих проектов, которые связаны между собой. В результате один тег проекта в CruiseControl имеет несколько проверок SVN, а затем набор задач msbuild компилирует все отдельные файлы sln.

Мне нужно обновить версию сборки всех решений, когда эта сборка выполняется. Однако, так как я не использую nant и не использую файлы proj MSBuild, я не уверен, как это получить.

Интересно, я что-то упускаю из виду? Мне просто нужно решение, которое может быть реализовано путем внесения соответствующих изменений в файл ccnet.config без необходимости внесения изменений в файлы csproj.

Спасибо, Anj

Ответы [ 3 ]

11 голосов
/ 23 января 2009

А как насчет использования общего AssemblyInfo в ваших проектах?

Вот что мы делаем для наших продуктов:

  • Каждый проект имеет собственный AssemblyInfo.cs - он содержит AssemblyTitle, AssemblyDescription, Guid и другие атрибуты, уникальные для этой сборки.

  • В каждом проекте также есть два других файла сведений о сборке, обратите внимание, что они добавляются как ссылки, а не как прямой файл (VS -> Добавить -> Существующий файл -> Добавить как ссылку (маленькая стрелка вниз рядом с добавлением). ))

Два файла ссылок:

  1. CompanyAssemblyInfo.cs - AssemblyCompany, AssemblyCopyright, AssemblyConfiguration, CLSCompliant, SecurityPermission и т. Д. В основном все, что мы хотим, является стандартом во всех наших сборках.

  2. ProductAssemblyInfo.cs - AssemblyProduct, AssemblyVersion, AssemblyFileVersion. Это позволяет нам распространять одну и ту же версию на все сборки из одного файла.

Наш CI и процесс выпуска более сложны, но это суть его - единственная точка (файл), которая контролирует версию продукта (сборки, установщики, все!)

6 голосов
/ 30 января 2009

Есть задача сделать то, о чем вы спрашиваете.

Вам нужно будет установить задачи MSBuildCommunity, найденные здесь .

Затем вы можете создать что-то вроде этого:

<PropertyGroup>
<MyAssemblyVersion>$(CCNetLabel)</MyAssemblyVersion>
</PropertyGroup>

<Target Name="GenAssemblyInfo">
    <AssemblyInfo
      ContinueOnError="false"
      CodeLanguage="CS"
      OutputFile="$(MSBuildProjectDirectory)\YourAssembly\AssemblyInfo.cs"
      AssemblyTitle="blah"
      AssemblyDescription="blah blah"
      AssemblyCompany="Anj Software, Inc."
      AssemblyProduct="Anj's Awesome App"
      AssemblyCopyright="blah blah"
      CLSCompliant="false"
      AssemblyVersion="$(MyAssemblyVersion)"
      AssemblyFileVersion="$(MyAssemblyVersion)"
     />
</Target>

Обратите внимание, что вы можете установить префикс номера сборки в файле ccnet.config, чтобы ваши сборки были пронумерованы как 2.1.0.x, где x - номер сборки. Вот как мы делаем нумерацию версий, где я работаю.

Вам все равно нужно будет хранить файл AssemblyInfo.cs по умолчанию как часть каждого из проектов, составляющих ваше решение.

3 голосов
/ 13 января 2009

Я использую PowerShell для этого. lpath - это путь к исходному коду, а buildnum - это мой номер сборки, который я добавляю. Это все, что я на самом деле делаю с этим. Тем не менее, он должен дать вам достаточно, чтобы изменить или установить любое или все другие доступные поля. Я передаю lpath и получаю номер сборки из доступных переменных среды в CC.NET, и я могу использовать этот сценарий снова и снова, просто меняя то, что передаю в командной строке в файле конфигурации. У меня также есть файл, который изменяет файлы ресурсов для кода C ++, если это действительно то, что вам нужно изменить.

$files = Get-ChildItem $lpath -recurse -filter *AssemblyInfo.cs -name

Foreach ($file in $files)
{
    $file = $lpath + "\" + $file

    $fileObject=get-item $file

    $fileObject.Set_IsReadOnly($False)

    $sr = new-object System.IO.StreamReader( $file, [System.Text.Encoding]::GetEncoding("utf-8") ) 
    $content = $sr.ReadToEnd()
    $sr.Close()

    $content = [Regex]::Replace( $content, '(?<=\[assembly: AssemblyVersion\("[0-9].[0-9].[0-9].)[0-9]?[0-9]?[0-9]', $buildnum);
    $content = [Regex]::Replace( $content, '(?<=\[assembly: AssemblyFileVersion\("[0-9].[0-9].[0-9].)[0-9]?[0-9]?[0-9]', $buildnum);

    $sw = new-object System.IO.StreamWriter( $file, $false, [System.Text.Encoding]::GetEncoding("utf-8") )
    $sw.Write( $content )
    $sw.Close()

    $fileObject.Set_IsReadOnly($True)
}
...