Domanda

Sto usando CCNET su un progetto di esempio con SVN come il mio controllo del codice sorgente.CCNET è configurato per creare una build su ogni check-in.CCNET utilizza MSBuild per costruire il codice sorgente.

Vorrei utilizzare l'ultima revisione numero di generare AssemblyInfo.cs durante la compilazione.Come posso recuperare l'ultima revisione da subversion e utilizzare il valore in CCNET?

Edit:Non sto a NAnt - solo MSBuild.

È stato utile?

Soluzione

CruiseControl.Net 1.4.4 è ora un Assemblea Versione Etichettatrice, che genera i numeri di versione compatibile con .Net assembly proprietà.

Nel mio progetto l'ho configurato così:

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

(Avvertenza: assemblyVersionLabeller non si avvia la generazione di revisione svn base di etichette fino a quando un commit-generazione del trigger si verifica.)

e poi consumare questo, dal mio MSBuild progetti con 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>

Per amor di completezza, è altrettanto facile per progetti che utilizzano NAnt invece di 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>

Altri suggerimenti

Sono disponibili due opzioni.Sia la scrittura di un semplice script che si avvia e analizzare uscita dal

svn.exe info --revisione TESTA

per ottenere il numero di revisione (generando quindi AssemblyInfo.cs è abbastanza dritto in avanti) o semplicemente usare il plugin per CCNET.Qui è:

Revisione SVN Etichettatrice è un plugin per CruiseControl.NET che consente di generare CruiseControl etichette per costruisce, in base al numero di revisione del tuo Subversion copia di lavoro.Questo può essere personalizzata con un prefisso e/o maggiore/minore numero di versione.

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

Io preferisco la prima opzione, perché è solo di circa 20 righe di codice:

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

Ho scritto un NAnt costruire il file che gestisce l'analisi di SVN informazioni e la creazione di proprietà.Ho quindi utilizzare quei valori di proprietà per una varietà di costruire i compiti, compresa l'impostazione etichetta sul costruire.Io uso questo obiettivo, combinato con la Revisione SVN Etichettatrice citato da lubos hasko, con ottimi risultati.

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

Ho trovato questo progetto su google code.Questo è CCNET plugin per generare l'etichetta in CCNET.

Il DLL è testato con CCNET 1.3 ma funziona con CCNET 1.4 per me.Io sto usando con successo questo plugin per etichettare la mia generazione.

Ora su di passarlo MSBuild...

Se si preferisce farlo sulla MSBuild lato CCNet config, sembra che la MSBuild Compiti di comunità dell'estensione SvnVersion compito potrebbe fare il trucco.

Attualmente sto "manualmente" farlo attraverso un prebuild-exec Compito, con il mio cmdnetsvnrev strumento, ma se qualcuno conosce una migliore ccnet integrato di farlo, sarei felice di sentire :-)

Personalizzazione dei file csproj autogenerato AssemblyInfo.cs
http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx

Ogni volta che creiamo un nuovo progetto C#, Visual Studio mette lì AssemblyInfo.cs file per noi.Il file definisce l'assemblea di meta-dati, come la sua versione, configurazione, o il produttore.

Trovato il modo di auto-gen AssemblyInfo.cs utilizzo di MSBuild.Post esempio poco.

Non sono sicuro se questo lavoro con CCNET o meno, ma ho creato un Versione SVN plug-in per il Versione Build Incremento progetto su CodePlex.Questo strumento è abbastanza flessibile, e può essere impostato per creare automaticamente un numero di versione che utilizza la revisione svn.Non richiede la scrittura di codice o di editing xml, quindi yay!

Spero che questo aiuta!

Il mio approccio è quello di utilizzare i suddetti plugin per ccnet e un nant eco compito di generare un VersionInfo.cs file contenente nulla, ma la versione attributi.Ho solo includere il VersionInfo.cs file nella build

L'eco compito semplicemente restituisce la stringa io la do a un file.

Se c'è una simile attività MSBuild, è possibile utilizzare lo stesso approccio.Ecco la piccola nant attività che uso:

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

Prova questo:

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

Si prega di notare che io non sono molto intima con MSBuild, quindi il mio script, probabilmente non funzionerà out-of-the-box e bisogno di correzioni...

Basato su skolimas soluzione che ho aggiornato la NAnt script per aggiornare anche il AssemblyFileVersion.Grazie per skolima per il codice!

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

Non ho idea di dove ho trovato questo.Ma ho trovato questo su internet "da qualche parte".

Questo aggiornamento di tutti i AssemblyInfo.cs file prima che la compilazione avviene.

Funziona come un fascino.Tutto il mio exe e le dll mostra come 1.2.3.333 (Se "333" sono stati la revisione SVN al momento.) (E la versione originale in AssemblyInfo.cs file è stato elencato come "1.2.3.0")


$(ProjectDir) (Dove il mio .sln si trova il file)

$(SVNToolPath) (punti svn.exe)

sono le mie variabili personalizzate, le loro dichiarazioni/definizioni non sono definite qui di seguito.


http://msbuildtasks.tigris.org/ e/o https://github.com/loresoft/msbuildtasks ha l' ( FileUpdate e SvnVersion ) compiti.


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

MODIFICA --------------------------------------------------

Il sopra può iniziare un errore dopo il SVN revision numero raggiunge 65534 o superiore.

Vedere:

Spegnere avviso CS1607

Ecco la soluzione.

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

Il risultato dovrebbe essere:

In Windows/Explorer//File/Proprietà.......

Assemblea Versione 1.0.0.0.

Versione del File sarà 1.0.0.333 se il 333 è la revisione SVN.

Essere attenti.La struttura utilizzata per costruire i numeri è solo una breve distanza in modo che si dispone di un soffitto in quanto è elevata la revisione può andare.

Nel nostro caso, abbiamo già superato il limite.

Se si tenta di inserire il numero di build 99.99.99.599999, la versione del file di proprietà verranno effettivamente venire fuori come 99.99.99.10175.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top