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

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

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

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

4.08.2008 11:37:24
12 ОТВЕТОВ
РЕШЕНИЕ

CruiseControl.Net 1.4.4 теперь имеет метку версии сборки , которая генерирует номера версий, совместимые со свойствами сборки .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>
45
21.09.2010 15:30:00
+1 Круто, это мне очень помогло. Я обновил вашу версию для NAnt, чтобы также обновить AssemblyFileVersion и некоторые мелочи. Это включено как другой ответ здесь в этой теме. Спасибо!
galaktor 12.09.2009 10:02:07
Другие не должны сбрасывать со счетов это предостережение; это очень важно. В результате на веб-сайтах есть много ответов о том, что это не работает. По-прежнему кажется, глючит, но триггер, который построить на проверку один раз, и все работает там, как и ожидалось после. - Спасибо большое
Chuck 10.05.2012 18:58:47
Ссылка на ярлык версии сборки не работает.
stephen 29.10.2015 19:18:53

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

Информация svn.exe - HEAD 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();
        }
    }
}
14
7.02.2016 00:39:57

Я написал файл сборки 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>
4
4.08.2008 13:43:54

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

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

Теперь перейдем к MSBuild...

4
25.04.2013 12:49:09

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

4
25.04.2013 13:00:54

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

3
4.08.2008 11:41:37

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

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

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

3
4.08.2008 13:22:31

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

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

3
12.04.2010 01:04:20

Мой подход состоит в том, чтобы использовать вышеупомянутый плагин для 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, поэтому мой скрипт, вероятно, не будет работать "из коробки" и нуждается в исправлениях ...

2
3.02.2009 04:27:12

На основе решения skolimas я обновил скрипт NAnt, чтобы также обновить AssemblyFileVersion. Спасибо Сколима за код!

<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>
2
12.09.2009 10:03:28

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

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

РЕДАКТИРОВАТЬ ------------------------------------------------- -

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

Увидеть:

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

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

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

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

В Windows / Explorer // Файл / Свойства …….

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

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

2
23.05.2017 11:46:30
Я думаю, что нашел оригинальное место, где я его нашел: geekswithblogs.net/mnf/archive/2009/07/03/…
granadaCoder 10.10.2012 18:46:39

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

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

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

1
3.02.2009 18:34:49
Разве это не тот случай, когда System.Version указывает .Revision, который является int32, и поэтому вы можете прочитать его, а не Minor и Major, которые являются замаскированными Int32, приведенными к короткому замыканию.
krystan honour 16.03.2010 09:39:30