Развертывание сборки в папку с номером сборки довольно просто. Задача CruiseControl.NET NAnt автоматически передает ряд свойств в ваш скрипт NAnt. Свойство CCNetLabel используется для создания каталога развертывания. На самом деле в документации CruiseControl.NET есть немного устаревший пример сценария NAnt, который делает именно это. Вот лучшая версия:
<target name="publish">
<if test="${not property::exists('CCNetLabel')}">
<fail message="CCNetLabel property not set, so can't create labelled distribution files" />
</if>
<property name="publishDirectory" value="D:\Public\Project\Builds\${CCNetLabel}" />
<mkdir dir="${publishDirectory}" />
<copy todir="${publishDirectory}">
<fileset basedir="${buildDirectory}\bin">
<include name="*.dll" />
</fileset>
</copy>
</target>
Что касается управления версиями ваших двоичных файлов, я считаю, что следующий подход намного чище и проще, чем пытаться изменить ваши файлы AssemblyInfo.cs. По сути, я создаю файл CommonAssemblyInfo.cs, который находится за пределами любых проектов, в том же каталоге, что и файл вашего решения. Этот файл включает в себя вещи, которые являются общими для всех сборок, которые я собираю, такие как название компании, информация об авторских правах и, конечно, версия. Этот файл связан в каждом проекте в Visual Studio, поэтому каждый проект включает эту информацию (вместе с гораздо меньшим файлом AssemblyInfo.cs, который включает информацию о конкретной сборке, такую как заголовок сборки).
Когда проекты создаются локально, либо через Visual Studio, либо через NAnt, используется этот файл CommonAssemblyInfo.cs. Однако, когда проекты создаются CruiseControl.NET, я использую NAnt для замены этого файла с помощью задачи <asminfo>
. Вот как выглядит скрипт NAnt:
<target name="version">
<property name="commonAssemblyInfo" value="${buildDirectory}\CommonAssemblyInfo.cs" />
<!-- If build is initiated manually, copy standard CommonAssemblyInfo.cs file. -->
<if test="${not property::exists('CCNetLabel')}">
<copy file=".\src\CommonAssemblyInfo.cs" tofile="${commonAssemblyInfo}" />
</if>
<!-- If build is initiated by CC.NET, create a custom CommonAssemblyInfo.cs file. -->
<if test="${property::exists('CCNetLabel')}">
<asminfo output="${commonAssemblyInfo}" language="CSharp">
<imports>
<import namespace="System" />
<import namespace="System.Reflection" />
</imports>
<attributes>
<attribute type="AssemblyCompanyAttribute" value="My Company" />
<attribute type="AssemblyCopyrightAttribute" value="Copyright © 2008 My Company" />
<attribute type="AssemblyProductAttribute" value="My Product" />
<attribute type="AssemblyVersionAttribute" value="1.0.0.${CCNetLabel}" />
<attribute type="AssemblyInformationalVersionAttribute" value="1.0.0.${CCNetLabel}" />
</attributes>
<references>
<include name="System.dll" />
</references>
</asminfo>
</if>
</target>
<target name="build-my-project" depends="version">
<csc target="library" output="${buildDirectory}\bin\MyProject.dll">
<sources>
<include name=".\src\MyProject\*.cs"/>
<include name=".\src\MyProject\**\*.cs"/>
<include name="${commonAssemblyInfo}"/>
</sources>
</csc>
</target>
Обратите внимание, что значения AssemblyVersionAttribute и AssemblyInformationalVersionAttribute установлены в цели версия . Свойство CCNetLabel вставляется в номера версий. Для получения дополнительной выгоды вы можете использовать плагин CruiseControl.NET, такой как ранее упомянутый SvnRevisionLabeller . Используя это, мы получаем сборки с метками типа «2.1.8239.0», где «8239» соответствует номеру ревизии Subversion, из которого мы строим. Мы выгружаем этот номер сборки непосредственно в наши AssemblyVersionAttribute и AssemblyInformationalVersionAttributes , и наши номера сборки и номера версий в наших сборках могут быть легко прослежены до определенной ревизии в нашей системе управления версиями .