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

Просто добавьте метод to_json в ваш класс следующим образом:

def to_json(self):
  return self.message # or how you want it to be serialized

И добавьте этот код (из этот ответ ) , чтобы где-то в верхней части всего:

from json import JSONEncoder

def _default(self, obj):
    return getattr(obj.__class__, "to_json", _default.default)(obj)

_default.default = JSONEncoder().default
JSONEncoder.default = _default

Это будет модуль monkey-patch json, когда он будет импортирован, поэтому JSONEncoder.default () автоматически проверяет специальный метод «to_json ()» и использует его для кодирования объект, если найден.

Так же, как сказал Онур, но на этот раз вам не нужно обновлять каждый json.dumps() в вашем проекте.

41
задан Paul Ratazzi 22 December 2017 в 18:59
поделиться

11 ответов

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
ответ дан 27 November 2019 в 00:29
поделиться

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

информация о svn.exe - ГОЛОВА пересмотра

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

Маркировочная машина Пересмотра SVN является плагином для CruiseControl.NET, который позволяет Вам генерировать маркировки CruiseControl для своих сборок, основанных на количестве пересмотра Вашей Подрывной деятельности, работающей копия. Это может быть настроено с префиксом и/или главными / номерами вспомогательной версии.

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
ответ дан Markus Safar 27 November 2019 в 00:29
поделиться

Я записал файл типа "build" NAnt, который обрабатывает парсинг информация о SVN и создание свойств. Я тогда использую те значения свойств для множества задач сборки, включая установку маркировки на сборке. Я использую эту цель, объединенную с Маркировочной машиной Пересмотра SVN, упомянутой 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
ответ дан Justin Walgran 27 November 2019 в 00:29
поделиться

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

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

Теперь на передачу его к MSBuild...

4
ответ дан Apurv 27 November 2019 в 00:29
поделиться

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

4
ответ дан Apurv 27 November 2019 в 00:29
поделиться

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

3
ответ дан Michael Stum 27 November 2019 в 00:29
поделиться

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

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

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

3
ответ дан hitec 27 November 2019 в 00:29
поделиться

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

, задача эха просто производит строку, которую я даю ему файлу.

, Если существует подобная задача 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 и нужен в исправлениях...

2
ответ дан R. Martinho Fernandes 27 November 2019 в 00:29
поделиться

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

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

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

1
ответ дан Dan 27 November 2019 в 00:29
поделиться

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

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

3
ответ дан 27 November 2019 в 00:29
поделиться

На основе решения 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>
2
ответ дан 27 November 2019 в 00:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: