Frage

Ich verwende CCNET für ein Beispielprojekt mit SVN als Quellcodeverwaltung.CCNET ist so konfiguriert, dass bei jedem Check-in ein Build erstellt wird.CCNET verwendet MSBuild, um den Quellcode zu erstellen.

Ich möchte zum Generieren die neueste Revisionsnummer verwenden AssemblyInfo.cs beim Kompilieren.Wie kann ich die neueste Revision von Subversion abrufen und den Wert in CCNET verwenden?

Bearbeiten:Ich verwende kein NAnt, sondern nur MSBuild.

War es hilfreich?

Lösung

CruiseControl.Net 1.4.4 hat jetzt eine Etikettiergerät für Montageversion, wodurch Versionsnummern generiert werden, die mit den .Net-Assembly-Eigenschaften kompatibel sind.

In meinem Projekt habe ich es wie folgt konfiguriert:

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

(Vorbehalt: assemblyVersionLabeller beginnt nicht mit der Generierung von SVN-Revisions-basierten Labels, bis ein tatsächlicher durch Commit ausgelöster Build erfolgt.)

und konsumiere dies dann aus meinen MSBuild-Projekten 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>

Der Vollständigkeit halber ist es für Projekte, die NAnt anstelle von MSBuild verwenden, genauso einfach:

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

Andere Tipps

Grundsätzlich haben Sie zwei Möglichkeiten.Entweder schreiben Sie ein einfaches Skript, das die Ausgabe startet und analysiert

svn.exe info --revision HEAD

um die Revisionsnummer zu erhalten (dann ist das Generieren von AssemblyInfo.cs ziemlich einfach) oder verwenden Sie einfach das Plugin für CCNET.Hier ist es:

SVN-Revisionsetikettierer ist ein Plugin für cruiseControl.net, mit dem Sie CruiseControl -Labels für Ihre Builds erstellen können, basierend auf der Revisionsnummer Ihrer Subversion -Arbeitskopie.Dies kann mit einem Präfix- und/oder Major/Minor -Versionsnummern angepasst werden.

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

Ich bevorzuge die erste Option, da sie nur etwa 20 Codezeilen umfasst:

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

Ich habe eine NAnt-Build-Datei geschrieben, die das Parsen von SVN-Informationen und das Erstellen von Eigenschaften übernimmt.Ich verwende diese Eigenschaftswerte dann für verschiedene Build-Aufgaben, einschließlich der Festlegung der Beschriftung für den Build.Ich verwende dieses Ziel in Kombination mit dem von lubos hasko erwähnten SVN Revision Labeller mit großartigen Ergebnissen.

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

ich fand Das Projekt auf Google-Code.Das ist CCNET Plugin zum Generieren des Etiketts CCNET.

Der DLL wird mit getestet CCNET 1.3 aber es funktioniert mit CCNET 1.4 Für mich.Ich verwende dieses Plugin erfolgreich, um meinen Build zu kennzeichnen.

Nun zur Weitergabe an MSBuild...

Wenn Sie es lieber auf der tun MSBuild Seite über dem CCNet config, sieht aus wie die MSBuild Community-Aufgaben-Erweiterung SvnVersion Aufgabe könnte den Zweck erfüllen.

Ich mache es derzeit „manuell“ über einen Prebuild-Exec-Task mit meinem cmdnetsvnrev Tool, aber wenn jemand eine bessere ccnet-integrierte Möglichkeit kennt, würde ich mich freuen, zu hören :-)

Anpassen von csproj-Dateien zur automatischen Generierung von AssemblyInfo.cs
http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx

Jedes Mal, wenn wir ein neues C# -Projekt erstellen, setzt Visual Studio die AssemblyInfo.cs -Datei für uns an.Die Datei definiert die Montage-Meta-Daten wie ihre Version, Konfiguration oder Produzentin.

Habe die obige Technik zur automatischen Generierung von AssemblyInfo.cs mithilfe von MSBuild gefunden.Werde in Kürze ein Beispiel veröffentlichen.

Ich bin mir nicht sicher, ob dies mit CCNET funktioniert oder nicht, aber ich habe eine erstellt SVN-Versions-Plug-in für die Build-Versionsinkrement Projekt auf CodePlex.Dieses Tool ist ziemlich flexibel und kann so eingestellt werden, dass es mithilfe der SVN-Revision automatisch eine Versionsnummer für Sie erstellt.Es ist nicht erforderlich, Code zu schreiben oder XML zu bearbeiten, also juhuu!

Ich hoffe, das hilft!

Mein Ansatz besteht darin, das oben genannte Plugin für ccnet und eine Nant-Echo-Aufgabe zu verwenden, um eine zu generieren VersionInfo.cs Datei, die nur die Versionsattribute enthält.Ich muss nur noch das mit einbeziehen VersionInfo.cs Datei in den Build einfügen

Die Echo-Aufgabe gibt einfach die Zeichenfolge, die ich ihr gebe, in eine Datei aus.

Wenn es eine ähnliche MSBuild-Aufgabe gibt, können Sie denselben Ansatz verwenden.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 vertraut bin, sodass mein Skript wahrscheinlich nicht sofort funktionieren wird und Korrekturen erforderlich sind ...

Basierend auf der Skolimas-Lösung habe ich das NAnt-Skript aktualisiert, um auch die AssemblyFileVersion zu aktualisieren.Danke an skolima für den Code!

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

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

Dadurch werden alle AssemblyInfo.cs-Dateien aktualisiert, bevor der Build stattfindet.

Klappt wunderbar.Alle meine Exe- und DLL-Dateien werden als 1.2.3.333 angezeigt (wenn „333“ zu diesem Zeitpunkt die SVN-Revision wäre.) (Und die Originalversion in der AssemblyInfo.cs-Datei wurde als „1.2.3.0“ aufgeführt.)


$(ProjectDir) (Wo sich meine .sln-Datei befindet)

$(SVNToolPath) (zeigt auf svn.exe)

sind meine benutzerdefinierten Variablen, ihre Deklarationen/Definitionen werden unten nicht definiert.


http://msbuildtasks.tigris.org/und/oderhttps://github.com/loresoft/msbuildtasksverfügt über die Aufgaben (FileUpdate und 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>

BEARBEITEN ------------------------------------------------- -

Das oben Genannte schlägt möglicherweise fehl, sobald Ihre SVN-Revisionsnummer 65534 oder höher erreicht.

Sehen:

Deaktivieren Sie die Warnung CS1607

Hier ist die Problemumgehung.

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

Das Ergebnis sollte sein:

Unter Windows/Explorer//Datei/Eigenschaften…….

Die Assembly-Version wird 1.0.0.0 sein.

Die Dateiversion ist 1.0.0.333, wenn 333 die SVN-Revision ist.

Seien Sie vorsichtig.Die für Build-Nummern verwendete Struktur ist nur kurz, sodass Sie eine Obergrenze dafür haben, wie hoch Ihre Revision sein kann.

In unserem Fall haben wir das Limit bereits überschritten.

Wenn Sie versuchen, die Build-Nummer 99.99.99.599999 einzugeben, lautet die Dateiversionseigenschaft tatsächlich 99.99.99.10175.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top