Сведения о вопросе

None

16:03, 1st July, 2020

Теги

Используйте ревизию SVN для обозначения сборки в CCNET

Просмотров: 570   Ответов: 12

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

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

Edit: я не использую NAnt-только MSBuild.



  Сведения об ответе

VCe znayu

18:03, 1st July, 2020

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

В моем проекте он настроен следующим образом:

<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>


  Сведения об ответе

ITSME

18:03, 1st July, 2020

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

svn.exe информация --ревизия HEAD

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

SVN Revision 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();
        }
    }
}


  Сведения об ответе

crush

18:03, 1st July, 2020

Я нашел этот проект на google code. Это CCNET плагин для генерации метки в CCNET .

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

Теперь перейдем к передаче его в MSBuild ...


  Сведения об ответе

lesha

18:03, 1st July, 2020

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


  Сведения об ответе

LIZA

18:03, 1st July, 2020

Я написал файл сборки NAnt, который обрабатывает синтаксический анализ информации SVN и создает свойства. Затем я использую эти значения свойств для различных задач построения, включая установку метки на сборке. Я использую этой цели в сочетании с SVN Этикетировочные пересмотре упомянутых Любош 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>


  Сведения об ответе

darknet

18:03, 1st July, 2020

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

Я надеюсь, что это поможет!


  Сведения об ответе

KOMP

18:03, 1st July, 2020

В настоящее время я "manually" делаю это через задачу prebuild-exec, используя мой инструмент cmdnetsvnrev, но если кто-то знает лучший способ интеграции ccnet, я был бы рад услышать :-)


  Сведения об ответе

VCe znayu

18:03, 1st July, 2020

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

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

Нашел вышеописанную технику для автогенерации AssemblyInfo.cs с помощью MSBuild. Скоро мы опубликуем образец.


  Сведения об ответе

PHPH

18:03, 1st July, 2020

На основе решения 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>


  Сведения об ответе

прога

18:03, 1st July, 2020

Мой подход заключается в использовании вышеупомянутого плагина для ccnet и задачи nant echo для создания файла 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, поэтому мой сценарий, вероятно, не будет работать out-of-the-box и нуждается в исправлениях...


  Сведения об ответе

nYU

18:03, 1st July, 2020

Понятия не имею, где я это нашел. Но я нашел это в интернете "somewhere".

Это обновляет все файлы 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 или выше.

Видеть:

Отключить предупреждение CS1607

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

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

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

В Windows/Explorer//File/Properties....

...

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

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


  Сведения об ответе

PHPH

18:03, 1st July, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться