Používat SVN revize označovat stavět v CCNET

hlasů
39

Já používám CCNET na ukázkový projekt s SVN jako můj zdroj ovládacího prvku. CCNET je nakonfigurován tak, aby vytvořit stavět na každém odchodu. CCNET používá MSBuild vytvořit zdrojový kód.

Chtěl bych používat nejnovější číslo verze generovat AssemblyInfo.cspři kompilaci. Jak mohu získat nejnovější revizi z podvratné činnosti a použít hodnotu v CCNET?

Edit: Nejsem pomocí NANT - pouze MSBuild.

Položena 04/08/2008 v 12:37
zdroj uživatelem
V jiných jazycích...                            


12 odpovědí

hlasů
44

CruiseControl.Net 1.4.4 má nyní verze sestavení etiketovací , který generuje čísla verzí kompatibilní s vlastnostmi Net montáž.

Ve své práci jsem se ho nakonfigurovat jako:

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

(Upozornění: assemblyVersionLabellernezačne vytvářet štítky svn revize založené dokud nedojde ke skutečné spáchání spouštěné build).

a pak konzumovat to z mých projektů MSBuild s 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>

Z důvodu úplnosti, je to stejně snadné projektů využívajících NANT namísto 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>
Odpovězeno 10/06/2009 v 13:37
zdroj uživatelem

hlasů
14

Máte v zásadě dvě možnosti. Buď si napsat jednoduchý skript, který se spustí a analyzovat výstup z

svn.exe info --revision HEAD

získat číslo revize (pak generuje AssemblyInfo.cs je do značné míry přímočará), nebo stačí použít plugin pro CCNET. Tady to je:

SVN revize etiketovací je plugin pro CruiseControl.NET, který vám umožní vytvářet CruiseControl štítky pro vaše staví, na základě počtu revize svého Subversion pracovní kopii. To může být přizpůsoben s předponou a / nebo větších / menších verzí čísel.

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

Dávám přednost první možnost, protože je to jen zhruba 20 řádků kódu:

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();
        }
    }
}
Odpovězeno 04/08/2008 v 12:56
zdroj uživatelem

hlasů
4

Napsal jsem stavět soubor NANT který zpracovává analýzy SVN informací a vytváření vlastností. Pak jsem použít tyto hodnoty vlastností pro různé výroby úkolů, včetně nastavení štítek na sestavení. Používám tento cíl v kombinaci s SVN revize etiketovací zmínil Luboš Hasko se skvělými výsledky.

<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>
Odpovězeno 04/08/2008 v 14:43
zdroj uživatelem

hlasů
4

Dáváte-li přednost, jak to udělat na MSBuildboku přes CCNetconfig, vypadá to, že MSBuildúkoly, prodlužovací Společenství je SvnVersionúkolem by mohlo stačit.

Odpovězeno 04/08/2008 v 13:03
zdroj uživatelem

hlasů
4

Našel jsem tento projekt na webu Google Code. To je CCNETzásuvný modul generování štítku v CCNET.

DLLSe zkouší CCNET 1.3, ale pracuje se CCNET 1.4na mě. Já jsem úspěšně používat tento plugin označovat svou postavu.

Právě na její předání do MSBuild...

Odpovězeno 04/08/2008 v 12:51
zdroj uživatelem

hlasů
3

Nejsem si jistý, jestli tato práce s CCNET nebo ne, ale já jsem vytvořil verze plug-in SVN pro Build Version Přírůstek projektu na CodePlex. Tento nástroj je velmi flexibilní a může být nastaven, aby se automaticky vytvoří číslo verze pro vás je využít revizi svn. To nevyžaduje psaní kódu nebo editaci xml, tak Hurá!

Doufám, že to pomáhá!

Odpovězeno 12/04/2010 v 02:04
zdroj uživatelem

hlasů
3

Přizpůsobení csproj soubory autogenerate AssemblyInfo.cs
http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx

Pokaždé, když jsme se vytvořit nový C # projektu Visual Studio tam umístí soubor AssemblyInfo.cs pro nás. Soubor definuje montážní metadata jako jeho verze, konfigurace nebo výrobce.

Nalezeno výše popsanou techniku ​​pro auto-gen AssemblyInfo.cs využitím MSBuild. Zaúčtuje vzorek krátce.

Odpovězeno 04/08/2008 v 14:22
zdroj uživatelem

hlasů
3

V současné době jsem „ručně“ dělat to přes Úkol prebuild-exec, pomocí mého cmdnetsvnrev nástroj, ale pokud někdo zná lepší ccnet integrovaný způsob, jak to udělat, tak bych rád slyšel :-)

Odpovězeno 04/08/2008 v 12:41
zdroj uživatelem

hlasů
2

Nemám ponětí, kde jsem to našel. Ale našel jsem to na internetu „někde“.

To aktualizuje všechny soubory AssemblyInfo.cs před sestavení probíhá.

Funguje jako kouzlo. Všechny mé exe je a DLL ukázat jako 1.2.3.333 (Jestliže je „333“ byla revize v době Slov.) (A původní verze v souboru AssemblyInfo.cs byl uveden jako „1.2.3.0“)


$ (ProjectDir) (kde můj .sln soubor umístěn)

$ (SVNToolPath) (body svn.exe)

jsou mé vlastní proměnné, jejich prohlášení / definice nejsou definovány níže.


http://msbuildtasks.tigris.org/ a / nebo https://github.com/loresoft/msbuildtasks má (FileUpdate a SvnVersion) úkoly.


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

UPRAVIT ------------------------------------------------- -

Výše uvedené může začít selhání poté, co váš SVN revize číslo dosáhne 65534 nebo vyšší.

Vidět:

Vypnout varovný CS1607

Zde je řešení.

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

Výsledkem by mělo být:

Ve Windows / Explorer // Soubor / Vlastnosti .......

Sestava Verze bude 1.0.0.0.

Soubor verze bude 1.0.0.333-li 333 je revize SVN.

Odpovězeno 18/09/2012 v 18:18
zdroj uživatelem

hlasů
2

Na skolimas řešení založená jsem aktualizoval scénář NANT také aktualizovat AssemblyFileVersion. Díky skolima pro kód!

<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>
Odpovězeno 12/09/2009 v 11:03
zdroj uživatelem

hlasů
2

Můj přístup je použít zmíněný plugin pro ccnet a úkol Nant ozvěny k vytvoření VersionInfo.cssouboru, který obsahuje nic, ale atributy verze. Mám jen zahrnout VersionInfo.cssoubor do sestavení

Ozvěna úkol jednoduše předává řetězec dávám jej do souboru.

Pokud existuje podobný MSBuild úkol, můžete použít stejný postup. Tady je malý Nant úkol já používám:

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

Zkuste to:

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

Vezměte prosím na vědomí, že nejsem moc intimní s MSBuild, takže můj skript pravděpodobně nebude fungovat out-of-the-box a potřebují opravy ...

Odpovězeno 03/02/2009 v 05:16
zdroj uživatelem

hlasů
1

Buď opatrný. Struktura používá pro čísla sestavení je jen krátká, takže budete mít strop na to, jak vysoko může vaše revize jít.

V našem případě jsme již byl překročen limit.

Pokusíte-li se dát do sestavení číslo 99.99.99.599999, bude vlastnost verze souboru ve skutečnosti vyjdou jako 99.99.99.10175.

Odpovězeno 03/02/2009 v 19:34
zdroj uživatelem

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