Просто добавьте метод 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()
в вашем проекте.
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>
У Вас есть в основном две опции. Любой, которого Вы пишете простому сценарию, который запустит и проанализирует вывод от
информация о svn.exe - ГОЛОВА пересмотра
для получения числа пересмотра (тогда генерирующий AssemblyInfo.cs является в значительной степени прямым) или просто использует плагин для CCNET. Здесь это:
Маркировочная машина Пересмотра SVN является плагином для CruiseControl.NET, который позволяет Вам генерировать маркировки CruiseControl для своих сборок, основанных на количестве пересмотра Вашей Подрывной деятельности, работающей копия. Это может быть настроено с префиксом и/или главными / номерами вспомогательной версии.
я предпочитаю право преимущественной покупки, потому что это - только примерно 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();
}
}
}
Я записал файл типа "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>
Я нашел этот проект на коде Google. Это CCNET
плагин для генерации маркировки в CCNET
.
Эти DLL
тестируется с CCNET 1.3
, но это работает с CCNET 1.4
для меня. Я успешно использую этот плагин для маркировки моей сборки.
Теперь на передачу его к MSBuild
...
Если Вы предпочитаете делать его на MSBuild
сторона по эти CCNet
конфигурация, похож MSBuild
расширение Задач Сообщества SvnVersion
, задача могла бы добиться цели.
Я в настоящее время "вручную" делаю его через Задачу должностного лица перед сборкой, с помощью моего инструмент cmdnetsvnrev , но если бы кто-то знает лучший ccnet-интегрированный способ сделать его, я был бы рад услышать:-)
Настройка csproj файлы для автоматической генерации AssemblyInfo.cs
http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspxКаждый раз, когда мы создаем новый проект C#, Visual Studio помещает там файл AssemblyInfo.cs для нас. Файл определяет метаданные блока как своя версия, конфигурация или производитель.
Найденный вышеупомянутая техника автогенералу AssemblyInfo.cs использование MSBuild. Отправит образец вскоре.
Мой подход должен использовать вышеупомянутый плагин для 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 и нужен в исправлениях...
Будьте осторожны. Структура, используемая для номеров сборки, является только коротким, таким образом, у Вас есть потолок о том, как высоко Ваш пересмотр может пойти.
В нашем случае, мы уже превысили предел.
, При попытке вставить номер сборки 99.99.99.599999, свойство версии файла на самом деле выйдет как 99.99.99.10175.
Я не уверен, работает ли это с CCNET или нет, но я создал подключаемый модуль версии SVN для Построить инкремент версии проекта на CodePlex. Этот инструмент довольно гибкий и может быть настроен на автоматическое создание номера версии для вас с помощью ревизии svn. Это не требует написания кода или редактирования xml, так что ура!
Надеюсь, это поможет!
На основе решения 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>