Utilisez Révision SVN pour étiqueter la construction en CCNET

voix
39

J'utilise CCNET sur un exemple de projet avec SVN comme mon contrôle de code source. CCNET est configuré pour créer une version sur chaque enregistrement. CCNET utilise MSBuild pour construire le code source.

Je voudrais utiliser le dernier numéro de révision pour générer AssemblyInfo.cslors de la compilation. Comment puis - je récupérer la dernière révision de la subversion et utiliser la valeur CCNET?

Edit: Je ne suis pas en utilisant NAnt - seulement MSBuild.

Créé 04/08/2008 à 12:37
source utilisateur
Dans d'autres langues...                            


12 réponses

voix
44

CruiseControl.Net 1.4.4 dispose désormais d' une version Assemblée étiqueteuse , qui génère des numéros de version compatible avec les propriétés d'assemblage .Net.

Dans mon projet, je l'ai configuré comme:

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

(Avertissement: assemblyVersionLabellerne commencer à générer des étiquettes à base de révision svn jusqu'à ce qu'une accumulation engager déclenchée réelle se produit.)

puis consommer ce de mes projets MSBuild avec 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>

Par souci de complétude, il est tout aussi facile pour les projets utilisant NAnt au lieu de 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>
Créé 10/06/2009 à 13:37
source utilisateur

voix
14

Vous avez deux options. Soit vous écrivez un script simple qui va commencer et analyser la sortie de

Informations svn.exe HEAD --revision

pour obtenir le numéro de révision (puis générer AssemblyInfo.cs est à peu près tout droit) ou tout simplement utiliser le plugin pour CCNET. C'est ici:

SVN Révision étiqueteuse est un plugin pour CruiseControl.NET qui vous permet de créer des étiquettes de CruiseControl pour vos constructions, en fonction du numéro de révision de votre copie de travail Subversion. Cela peut être personnalisé avec un préfixe et / ou majeurs / mineurs numéros de version.

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

Je préfère la première option car il est seulement environ 20 lignes de code:

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();
        }
    }
}
Créé 04/08/2008 à 12:56
source utilisateur

voix
4

J'ai écrit un fichier de construction NAnt qui gère l'analyse des informations SVN et la création de propriétés. J'utilise ensuite ces valeurs de propriété pour une variété de tâches de construction, y compris la mise sur l'étiquette de la construction. J'utilise cet objectif combiné à la révision SVN étiqueteuse mentionné par Lubos hasko avec d'excellents résultats.

<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>
Créé 04/08/2008 à 14:43
source utilisateur

voix
4

Si vous préférez le faire sur le MSBuildcôté au- dessus de la CCNetconfiguration, ressemble à la MSBuildde l' extension des tâches communautaires SvnVersiontâche pourrait faire l'affaire.

Créé 04/08/2008 à 13:03
source utilisateur

voix
4

J'ai trouvé ce projet sur le code google. Ceci est le CCNETplugin pour générer l'étiquette CCNET.

Le DLLest testé avec CCNET 1.3mais il travaille avec CCNET 1.4pour moi. J'utilise avec succès ce plugin pour étiqueter la construction.

Maintenant , sur ce passage à MSBuild...

Créé 04/08/2008 à 12:51
source utilisateur

voix
3

Je ne sais pas si ce travail avec CCNET ou non, mais je l' ai créé un plug-in version SVN pour la construction à la version supérieure projet sur CodePlex. Cet outil est assez flexible et peut être configuré pour créer automatiquement un numéro de version pour vous en utilisant la révision svn. Il ne nécessite pas écrire de xml code ou l' édition, donc yay!

J'espère que cela aide!

Créé 12/04/2010 à 02:04
source utilisateur

voix
3

Personnalisation des fichiers csproj à autogenerate AssemblyInfo.cs
http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx

Chaque fois que nous créons un nouveau projet C #, Visual Studio y met le fichier AssemblyInfo.cs pour nous. Le fichier définit l'Assemblée méta-données comme sa version, la configuration ou le producteur.

Trouvé la technique ci-dessus pour l'auto-gen AssemblyInfo.cs utilisant MSBuild. Sera bientôt poster échantillon.

Créé 04/08/2008 à 14:22
source utilisateur

voix
3

Je suis actuellement « manuellement » il fait à travers une tâche prebuild-exec, en utilisant mon cmdnetsvnrev outil, mais si quelqu'un connaît une meilleure façon intégrée CCNet-de le faire, je serais heureux d'entendre :-)

Créé 04/08/2008 à 12:41
source utilisateur

voix
2

Aucune idée où je trouvais cela. Mais je trouve cela sur Internet « quelque part ».

Cela met à jour tous les fichiers AssemblyInfo.cs avant la construction a lieu.

Fonctionne comme un charme. Tous mes exe et le spectacle de dll comme 1.2.3.333 (Si « 333 » ont été la révision SVN à l'époque.) (Et la version originale dans le fichier AssemblyInfo.cs a été répertorié comme « 1.2.3.0 »)


$ (ProjectDir) (Si mon fichier .sln réside)

$ (SVNToolPath) (points svn.exe)

sont mes variables personnalisées, leurs déclarations / définitions ne sont pas définies ci-dessous.


http://msbuildtasks.tigris.org/ et / ou https://github.com/loresoft/msbuildtasks a les tâches (FileUpdate et 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>

MODIFIER ------------------------------------------------- -

Ce qui précède peut commencer à défaut après votre numéro de révision SVN atteint 65534 ou plus.

Voir:

Désactiver le CS1607 d'avertissement

Voici la solution de contournement.

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

Le résultat de cela devrait être:

Dans le fichier Windows / Explorer / Propriétés .......

Assemblée Version sera 1.0.0.0.

Version du fichier sera 1.0.0.333 si 333 est la révision SVN.

Créé 18/09/2012 à 18:18
source utilisateur

voix
2

Sur la base de la solution de skolimas je mis à jour le script NAnt également mettre à jour le AssemblyFileVersion. Merci à skolima pour le 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>
Créé 12/09/2009 à 11:03
source utilisateur

voix
2

Mon approche consiste à utiliser le plugin ci - dessus pour CCNet et une tâche d'écho nante pour générer un VersionInfo.csrien contenant de fichier , mais la version attributs. Je dois seulement inclure le VersionInfo.csfichier dans la construction

La tâche echo affiche simplement la chaîne que je donne à un fichier.

S'il y a une semblable tâche MSBuild, vous pouvez utiliser la même approche. Voici la petite tâche de Nant j'utilise:

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

Essaye ça:

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

S'il vous plaît noter que je ne suis pas très intime avec MSBuild, donc mon script ne fonctionnera probablement pas hors de la boîte et ont besoin des corrections ...

Créé 03/02/2009 à 05:16
source utilisateur

voix
1

Faites attention. La structure utilisée pour les nombres de construction est seulement une courte si vous avez un plafond sur la hauteur de votre révision peut aller.

Dans notre cas, nous avons déjà dépassé la limite.

Si vous essayez de mettre dans le numéro de build 99.99.99.599999, la propriété version du fichier sera en fait sortir comme 99.99.99.10175.

Créé 03/02/2009 à 19:34
source utilisateur

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