2008-08-04 2 views
39

Я использую CCNET на примере проекта с SVN в качестве исходного элемента управления. CCNET настроен на создание сборки при каждой проверке. CCNET использует MSBuild для создания исходного кода.Использовать SVN Редактирование для создания меток в CCNET

Я бы хотел использовать последний номер версии для генерации AssemblyInfo.cs при компиляции. Как я могу получить последнюю версию из подрывной работы и использовать значение в CCNET?

Редактировать: Я не использую NAnt - только MSBuild.

ответ

44

CruiseControl.Net 1.4.4 теперь имеет Assembly Version Labeller, который генерирует номера версий, совместимые с свойствами сборки .Net.

В моем проекте я это сконфигурировано как:

<labeller type="assemblyVersionLabeller" incrementOnFailure="true" major="1" minor="2"/> 

(Оговорка:. assemblyVersionLabeller не заводится не генерируя этикетки на основе ревизии SVN до фактического совершения запускаемых сборки происходит)

, а затем потреблять это из моих проектов MSBuild с MSBuildCommunityTasks.AssemblyInfo:

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> 
<Target Name="BeforeBuild"> 
    <AssemblyInfo Condition="'$(CCNetLabel)' != ''" CodeLanguage="CS" OutputFile="Properties\AssemblyInfo.cs" 
    AssemblyTitle="MyTitle" AssemblyCompany="MyCompany" AssemblyProduct="MyProduct" 
    AssemblyCopyright="Copyright © 2009" ComVisible="false" Guid="some-random-guid" 
    AssemblyVersion="$(CCNetLabel)" AssemblyFileVersion="$(CCNetLabel)"/> 
</Target> 

ради Комплектность, это так же просто для проектов с использованием NAnt ИНСТЕ объявление MSBuild:

<target name="setversion" description="Sets the version number to CruiseControl.Net label."> 
    <script language="C#"> 
     <references> 
      <include name="System.dll" /> 
     </references> 
     <imports> 
      <import namespace="System.Text.RegularExpressions" /> 
     </imports> 
     <code><![CDATA[ 
      [TaskName("setversion-task")] 
      public class SetVersionTask : Task 
      { 
       protected override void ExecuteTask() 
       { 
       StreamReader reader = new StreamReader(Project.Properties["filename"]); 
       string contents = reader.ReadToEnd(); 
       reader.Close(); 
       string replacement = "[assembly: AssemblyVersion(\"" + Project.Properties["CCNetLabel"] + "\")]"; 
       string newText = Regex.Replace(contents, @"\[assembly: AssemblyVersion\("".*""\)\]", replacement); 
       StreamWriter writer = new StreamWriter(Project.Properties["filename"], false); 
       writer.Write(newText); 
       writer.Close(); 
       } 
      } 
      ]]> 
     </code> 
    </script> 
    <foreach item="File" property="filename"> 
     <in> 
      <items basedir=".."> 
       <include name="**\AssemblyInfo.cs"></include> 
      </items> 
     </in> 
     <do> 
      <setversion-task /> 
     </do> 
    </foreach> 
</target> 
+3

+1 Удивительно, это мне очень помогло. Я обновил вашу версию для NAnt, чтобы также обновить AssemblyFileVersion и некоторые незначительные вещи. Он включен в качестве другого ответа здесь, в этой теме. Благодаря! – galaktor 2009-09-12 10:02:07

+0

Другие не должны отказываться от этого оговорки; это очень важно. В результате в Интернете есть много ответов, в которых говорится, что это не работает. Все еще кажется багги, но триггер, который строится на чеке, и все работает так, как ожидается, после этого. - Спасибо, связка – Chuck 2012-05-10 18:58:47

3

я в настоящее время «вручную» это делать через prebuild-Exec задачи, используя мой cmdnetsvnrev инструмент, но если кто-то знает лучше CCNET-интегрированный способ сделать это, я был бы рад услышать :-)

4

Я нашел this проект в коде google. Это плагин CCNET для создания метки в CCNET.

DLL проверено на CCNET 1.3, но оно работает с CCNET 1.4 для меня. Я успешно использую этот плагин для маркировки моей сборки.

Теперь на прохождение его MSBuild ...

14

У вас есть в основном два варианта. Либо написать простой скрипт, который будет запускать и анализировать выход из

svn.exe Информация --revision ГОЛОВЫ

получить номер версии (то порождающий AssemblyInfo.cs довольно много прямо вперед) или просто использовать плагин для CCNET. Вот оно:

СВН Редакция Labeller представляет собой плагин для CruiseControl.NET, который позволяет генерировать CruiseControl этикетки для вашего строит, основываясь на номер версии вашей рабочей копии Subversion. Этот можно настроить с помощью префикса и/или основных/младших версий.

http://code.google.com/p/svnrevisionlabeller/

Я предпочитаю первый вариант, потому что это только примерно 20 строк кода:

using System; 
using System.Diagnostics; 

namespace SvnRevisionNumberParserSample 
{ 
    class Program 
    { 
     static void Main() 
     { 
      Process p = Process.Start(new ProcessStartInfo() 
       { 
        FileName = @"C:\Program Files\SlikSvn\bin\svn.exe", // path to your svn.exe 
        UseShellExecute = false, 
        RedirectStandardOutput = true, 
        Arguments = "info --revision HEAD", 
        WorkingDirectory = @"C:\MyProject" // path to your svn working copy 
       }); 

      // command "svn.exe info --revision HEAD" will produce a few lines of output 
      p.WaitForExit(); 

      // our line starts with "Revision: " 
      while (!p.StandardOutput.EndOfStream) 
      { 
       string line = p.StandardOutput.ReadLine(); 
       if (line.StartsWith("Revision: ")) 
       { 
        string revision = line.Substring("Revision: ".Length); 
        Console.WriteLine(revision); // show revision number on screen      
        break; 
       } 
      } 

      Console.Read(); 
     } 
    } 
} 
4

Если вы предпочитаете делать это на MSBuild стороне над CCNet конфигурации, выглядит как MSBuild Задача расширения задач сообщества SvnVersion может сделать трюк.

3

Настройка csproj файлов автоматического создания AssemblyInfo.cs
http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx

Каждый раз, когда мы создаем новый C# проект, Visual Studio помещает там файл AssemblyInfo.cs для нас. Файл определяет метаданные сборки, например , ее версию, конфигурацию или производителя.

Обнаружена указанная выше техника для автоматического создания AssemblyInfo.cs с использованием MSBuild. В ближайшее время опубликует образец.

4

Я написал файл сборки NAnt, который обрабатывает разбор информации SVN и создание свойств. Затем я использую эти значения свойств для множества задач сборки, включая установку метки в сборке. Я использую эту цель в сочетании с SVN Revision Labeller, упомянутой lubos hasko с отличными результатами.

<target name="svninfo" description="get the svn checkout information"> 
    <property name="svn.infotempfile" value="${build.directory}\svninfo.txt" /> 
    <exec program="${svn.executable}" output="${svn.infotempfile}"> 
     <arg value="info" /> 
    </exec> 
    <loadfile file="${svn.infotempfile}" property="svn.info" /> 
    <delete file="${svn.infotempfile}" /> 

    <property name="match" value="" /> 

    <regex pattern="URL: (?'match'.*)" input="${svn.info}" /> 
    <property name="svn.info.url" value="${match}"/> 

    <regex pattern="Repository Root: (?'match'.*)" input="${svn.info}" /> 
    <property name="svn.info.repositoryroot" value="${match}"/> 

    <regex pattern="Revision: (?'match'\d+)" input="${svn.info}" /> 
    <property name="svn.info.revision" value="${match}"/> 

    <regex pattern="Last Changed Author: (?'match'\w+)" input="${svn.info}" /> 
    <property name="svn.info.lastchangedauthor" value="${match}"/> 

    <echo message="URL: ${svn.info.url}" /> 
    <echo message="Repository Root: ${svn.info.repositoryroot}" /> 
    <echo message="Revision: ${svn.info.revision}" /> 
    <echo message="Last Changed Author: ${svn.info.lastchangedauthor}" /> 
</target> 
2

Мой подход заключается в использовании вышеупомянутого плагин для CCNET и NANT эхо задачи, чтобы сгенерировать VersionInfo.cs файл, содержащий ничего, кроме атрибутов версии. Мне нужно включить файл VersionInfo.cs в сборку

Задача echo просто выводит строку, которую я передаю в файл.

Если есть аналогичная задача MSBuild, вы можете использовать тот же подход. Вот небольшая Nant задача я использую:

<target name="version" description="outputs version number to VersionInfo.cs"> 
    <echo file="${projectdir}/Properties/VersionInfo.cs"> 
    [assembly: System.Reflection.AssemblyVersion("$(CCNetLabel)")] 
    [assembly: System.Reflection.AssemblyFileVersion("$(CCNetLabel)")] 
    </echo> 
</target> 

Попробуйте это:

<ItemGroup> 
    <VersionInfoFile Include="VersionInfo.cs"/> 
    <VersionAttributes> 
     [assembly: System.Reflection.AssemblyVersion("${CCNetLabel}")] 
     [assembly: System.Reflection.AssemblyFileVersion("${CCNetLabel}")] 
    </VersionAttributes> 
</ItemGroup> 
<Target Name="WriteToFile"> 
    <WriteLinesToFile 
     File="@(VersionInfoFile)" 
     Lines="@(VersionAttributes)" 
     Overwrite="true"/> 
</Target> 

Пожалуйста, обратите внимание, что я не очень близок с MSBuild, так что мой сценарий, вероятно, не работать вне в- поле и необходимые корректировки ...

1

Будьте осторожны. Структура, используемая для чисел сборки, является лишь короткой, поэтому у вас есть потолок относительно того, насколько высока ваша ревизия.

В нашем случае мы уже превысили лимит.

Если вы попытаетесь вставить номер сборки 99.99.99.599999, свойство версии файла выйдет как 99.99.99.10175.

+0

Это не тот случай, когда System.Version задает .Revision, который является int32, и поэтому вы можете прочитать это, а не Minor и Major, которые маскируются в Int32, на короткий. – 2010-03-16 09:39:30

2

Основываясь на решении skolimas, я обновил сценарий NAnt, чтобы обновить AssemblyFileVersion. Благодаря skolima для кода!

<target name="setversion" description="Sets the version number to current label."> 
     <script language="C#"> 
      <references> 
        <include name="System.dll" /> 
      </references> 
      <imports> 
        <import namespace="System.Text.RegularExpressions" /> 
      </imports> 
      <code><![CDATA[ 
        [TaskName("setversion-task")] 
        public class SetVersionTask : Task 
        { 
         protected override void ExecuteTask() 
         { 
         StreamReader reader = new StreamReader(Project.Properties["filename"]); 
         string contents = reader.ReadToEnd(); 
         reader.Close();      
         // replace assembly version 
         string replacement = "[assembly: AssemblyVersion(\"" + Project.Properties["label"] + "\")]"; 
         contents = Regex.Replace(contents, @"\[assembly: AssemblyVersion\("".*""\)\]", replacement);           
         // replace assembly file version 
         replacement = "[assembly: AssemblyFileVersion(\"" + Project.Properties["label"] + "\")]"; 
         contents = Regex.Replace(contents, @"\[assembly: AssemblyFileVersion\("".*""\)\]", replacement);           
         StreamWriter writer = new StreamWriter(Project.Properties["filename"], false); 
         writer.Write(contents); 
         writer.Close(); 
         } 
        } 
        ]]> 
      </code> 
     </script> 
     <foreach item="File" property="filename"> 
      <in> 
        <items basedir="${srcDir}"> 
          <include name="**\AssemblyInfo.cs"></include> 
        </items> 
      </in> 
      <do> 
        <setversion-task /> 
      </do> 
     </foreach> 
    </target> 
3

Я не уверен, если это работа с CCNET или нет, но я создана SVN version plug-in для Build Version Increment проекта на CodePlex. Этот инструмент довольно гибкий и может быть настроен на автоматическое создание номера версии для вас с помощью ревизии svn. Это не требует написания кода или редактирования xml, так что yay!

Надеюсь, это поможет!

2

Не знаю, где я нашел это. Но я нашел это в Интернете «где-то».

Это обновление всех файлов AssemblyInfo.cs до сборки.

Работает как очарование. Все мои exe и dll отображаются в виде 1.2.3.333 (если «333» были версией SVN в то время.) (И исходная версия в файле AssemblyInfo.cs была указана как «1.2.3.0»)


$ (ProjectDir) (Где мой .sln файл находится)

$ (SVNToolPath) (указывает на svn.exe)

мои пользовательские переменные, их декларации/определения не определены ниже.


http://msbuildtasks.tigris.org/ и/или https://github.com/loresoft/msbuildtasks имеет задачи (FileUpdate и SvnVersion).


<Target Name="SubVersionBeforeBuildVersionTagItUp"> 

    <ItemGroup> 
     <AssemblyInfoFiles Include="$(ProjectDir)\**\*AssemblyInfo.cs" /> 
    </ItemGroup> 

    <SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="$(SVNToolPath)"> 
     <Output TaskParameter="Revision" PropertyName="MySubVersionRevision" /> 
    </SvnVersion> 

    <FileUpdate Files="@(AssemblyInfoFiles)" 
      Regex="(\d+)\.(\d+)\.(\d+)\.(\d+)" 
      ReplacementText="$1.$2.$3.$(MySubVersionRevision)" /> 
    </Target> 

EDIT --------------------------------------- -----------

Вышеуказанное может начать сбой после того, как ваш номер версии SVN достигнет 65534 или выше.

См:

Turn off warning CS1607

Вот обходной путь.

<FileUpdate Files="@(AssemblyInfoFiles)" 
Regex="AssemblyFileVersion\(&quot;(\d+)\.(\d+)\.(\d+)\.(\d+)" 
ReplacementText="AssemblyFileVersion(&quot;$1.$2.$3.$(SubVersionRevision)" /> 

Результатом этого должно быть:

В Windows/Проводнике // Файл/Свойства .......

Версия сборки будет 1.0.0.0.

Версия файла будет 1.0.0.333, если 333 является версией SVN.

Смежные вопросы