Verwenden Sie SVN Revision in CCNET bauen zu beschriften

stimmen
39

Ich verwende CCNET auf einem Beispielprojekt mit SVN als meine Quellcodeverwaltung. CCNET konfiguriert ist, in einen Build auf jeder Prüfung zu schaffen. CCNET verwendet MSBuild den Quellcode zu bauen.

Ich mag die aktuelle Versionsnummer verwenden , um zu erzeugen AssemblyInfo.csbeim Kompilieren. Wie kann ich die neueste Version von Subversion und verwenden Sie den Wert in CCNET abrufen?

Edit: Ich bin nicht mit NAnt - nur MSBuild.

Veröffentlicht am 04/08/2008 um 12:37
quelle vom benutzer
In anderen Sprachen...                            


12 antworten

stimmen
44

1.4.4 CruiseControl.Net hat jetzt eine Assembly Version Etikettierer , die Versionsnummern kompatibel mit .NET Assembly Eigenschaften erzeugt.

In meinem Projekt habe ich es konfiguriert als:

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

(Caveat: assemblyVersionLabellerstartet nicht SVN Revision Etiketten bis eine tatsächliche begehen ausgelöste Build tritt zu erzeugen.)

und dann verbrauchen diese von meiner MSBuild Projekte mit 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>

Aus Gründen der Vollständigkeit, dann ist es genauso einfach für Projekte mit NAnt statt 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>
Beantwortet am 10/06/2009 um 13:37
quelle vom benutzer

stimmen
14

Sie haben grundsätzlich zwei Möglichkeiten. Entweder schreiben Sie ein einfaches Skript, das ausgegeben wird gestartet und analysieren aus

svn.exe info --revision HEAD

Revisionsnummer (dann AssemblyInfo.cs Erzeugung ist ziemlich geradlinig) oder einfach nur benutzen Plugin für CCNET zu erhalten. Hier ist es:

SVN Revision Etikettierer ist ein Plugin für CruiseControl.NET , die Sie CruiseControl- Etiketten generieren können für Ihre baut, basierend auf der Versionsnummer Ihres Subversion - Arbeitskopie. Dies kann mit einem Präfix und / oder Major / Minor - Versionsnummern angepasst werden.

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

Ich ziehe es die erste Option, da es nur etwa 20 Zeilen Code ist:

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();
        }
    }
}
Beantwortet am 04/08/2008 um 12:56
quelle vom benutzer

stimmen
4

Ich habe eine NAnt Build-Datei geschrieben, die SVN-Informationen behandelt Parsen und Erstellen von Eigenschaften. Ich benutze dann die Eigenschaftswerte für eine Vielzahl von Build-Aufgaben, darunter das Etikett auf der Build-Einstellung. Ich benutze dieses Ziel mit der SVN Revision Etikettierer von lubos Hasko mit sehr guten Ergebnissen erwähnt kombiniert.

<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>
Beantwortet am 04/08/2008 um 14:43
quelle vom benutzer

stimmen
4

Wenn Sie es auf der lieber tun MSBuildSeite über die CCNetConfig, sieht aus wie die MSBuildCommunity - Aufgaben Erweiterung der SvnVersionAufgabe könnte den Trick tun.

Beantwortet am 04/08/2008 um 13:03
quelle vom benutzer

stimmen
4

Ich fand dieses Projekt auf Google Code. Dies wird CCNETPlugin das Etikett in zu erzeugen CCNET.

Das DLList getestet mit , CCNET 1.3aber es funktioniert mit CCNET 1.4für mich. Ich verwende erfolgreich dieses Plugin mein Build zu beschriften.

Jetzt auf sie vorbei MSBuild...

Beantwortet am 04/08/2008 um 12:51
quelle vom benutzer

stimmen
3

Ich bin mir nicht sicher , ob diese Arbeit mit CCNET oder nicht, aber ich habe eine erstellt SVN - Version Plug-in für das Build - Version Increment Projekt auf CodePlex. Dieses Tool ist sehr flexibel und kann so eingestellt werden , um automatisch eine Versionsnummer zu erstellen , damit Sie die SVN - Revision verwenden. Es erfordert keinen Code oder Bearbeiten von XML zu schreiben, so yay!

Ich hoffe, das ist hilft!

Beantwortet am 12/04/2010 um 02:04
quelle vom benutzer

stimmen
3

Anpassen csproj Dateien automatisch generieren AssemblyInfo.cs
http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx

Jedes Mal, wenn wir einen neuen C # -Projekt, Visual Studio erstellen setzt dort die Datei AssemblyInfo.cs für uns. Die Datei definiert die Montage Meta-Daten wie seine Version, Konfiguration oder Produzent.

Fand die oben beschriebene Technik zum automatischen gen AssemblyInfo.cs MSBuild verwenden. Will post kurz Probe.

Beantwortet am 04/08/2008 um 14:22
quelle vom benutzer

stimmen
3

Ich bin zur Zeit „ von Hand“ tue es durch eine vorkompilierte-exec Aufgabe, mein mit cmdnetsvnrev Werkzeug, aber wenn jemand eine bessere Ccnet integrierte Art und Weise , es zu tun weiß, würde ich glücklich sein :-) zu hören

Beantwortet am 04/08/2008 um 12:41
quelle vom benutzer

stimmen
2

Keine Ahnung, wo ich das gefunden. Aber ich fand diese im Internet „irgendwo“.

Dies aktualisiert alle AssemblyInfo.cs Dateien vor der Build stattfindet.

Klappt wunderbar. Alle meine exe und DLL zeigen sich als 1.2.3.333 (Wenn „333“ waren die SVN Revision zu der Zeit.) (Und die ursprüngliche Version in der AssemblyInfo.cs-Datei wurde als „1.2.3.0“ aufgeführt)


$ (ProjectDir) (Wo ist mein SLN-Datei befindet)

$ (SVNToolPath) (Punkte svn.exe)

meine benutzerdefinierten Variablen, ihre Erklärungen / Definitionen sind nicht unten definiert.


http://msbuildtasks.tigris.org/ und / oder https://github.com/loresoft/msbuildtasks das (Fileupdate und svnversion) Aufgaben.


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

Die oben kann Fehler beginnen nach dem SVN-Revisionsnummer 65534 oder höher erreicht.

Sehen:

Schalten Sie Warnung CS1607

Hier ist die Abhilfe.

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

Das Ergebnis sollte sein:

In Windows / Explorer // Datei / Eigenschaften .......

Assembly Version wird 1.0.0.0 sein.

Dateiversion wird 1.0.0.333 wenn 333 die SVN-Revision ist.

Beantwortet am 18/09/2012 um 18:18
quelle vom benutzer

stimmen
2

skolimas Lösung auf Basis von I Nant Skript aktualisiert, um auch die Assembly zu aktualisieren. Vielen Dank für den Code 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>
Beantwortet am 12/09/2009 um 11:03
quelle vom benutzer

stimmen
2

Mein Ansatz ist es, die oben genannte Plugin für Ccnet und Nant Echo Aufgabe zu verwenden , um ein zu erzeugen VersionInfo.csDatei enthält nichts anderes als die Versionsattribute. Ich habe nur die enthalten VersionInfo.csDatei in die Build

Das Echo Aufgabe gibt einfach die Zeichenfolge ich es in eine Datei geben.

Wenn es eine ähnliche MSBuild Aufgabe ist, können Sie den gleichen Ansatz. Hier ist die kleine Nant Aufgabe, die ich verwende:

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

Versuche dies:

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

Bitte beachten Sie, dass ich mit MSBuild nicht sehr intim bin, so mein Skript wird wahrscheinlich nicht out-of-the-box arbeiten und Korrekturen müssen ...

Beantwortet am 03/02/2009 um 05:16
quelle vom benutzer

stimmen
1

Achtung. Die Struktur für Build-Nummern verwendet wird, ist nur eine kurze so haben Sie eine Decke auf, wie hoch Ihre Revision gehen.

In unserem Fall haben wir bereits überschritten die Grenze.

Wenn Sie in der Build-Nummer 99.99.99.599999, die Dateiversion Eigenschaft zu setzen versuchen wird, kommt tatsächlich als 99.99.99.10175 aus.

Beantwortet am 03/02/2009 um 19:34
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more