Użyj SVN Wersja do etykiety zbudować w CCNET

głosy
39

Używam CCNET na projekt próbki z SVN jak mój kontroli źródła. CCNET jest skonfigurowany do tworzenia kompilacji na każdym zameldowania. CCNET wykorzystuje MSBuild zbudować kodu źródłowego.

Chciałbym korzystać z najnowszych numer poprawki do generowania AssemblyInfo.cspodczas kompilacji. Jak mogę pobrać najnowszą wersję z wywrotową i użyć wartości w CCNET?

Edit: Nie używam NAnt - tylko MSBuild.

Utwórz 04/08/2008 o 12:37
źródło użytkownik
W innych językach...                            


12 odpowiedzi

głosy
44

CruiseControl.Net 1.4.4 ma teraz Version Assembly etykietowania , który generuje numery wersji zgodnych z właściwościami NET.

W moim projekcie mam to skonfigurowane jako:

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

(Niestety, assemblyVersionLabellernie rozpocznie generowanie etykiet rewizji svn opartych aż rzeczywisty popełnić wyzwalane build występuje).

a następnie zużywają to z moich projektów MSBuild z 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>

W celu zapewnienia kompletności, to tak samo łatwe dla projektów wykorzystujących NAnt zamiast 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>
Odpowiedział 10/06/2009 o 13:37
źródło użytkownik

głosy
14

Masz w zasadzie dwie opcje. Albo napisać prosty skrypt, który rozpocznie się i przetwarza dane wyjściowe z

svn.exe informacji --revision HEAD

aby uzyskać numer wersji (wtedy generowania AssemblyInfo.cs jest prawie prosto do przodu) lub po prostu użyć wtyczki dla CCNET. Oto ona:

SVN Revision Etykieciarka jest plugin dla CruiseControl.NET, który pozwala na generowanie etykiet CruiseControl dla Twojego buduje, w oparciu o numer wersji swojej kopii roboczej Subversion. To może być dostosowany z prefiksem i / lub główny / poboczny numery wersji.

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

Wolę pierwszą opcję, ponieważ jest to tylko około 20 linii kodu:

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();
        }
    }
}
Odpowiedział 04/08/2008 o 12:56
źródło użytkownik

głosy
4

Pisałem plik build nant, który obsługuje analizowanie informacji SVN i tworzenia właściwości. I następnie wykorzystać te wartości nieruchomości dla różnych zadań, w tym ustawienie kompilacji etykietę na budowie. Używać tego celu połączone z SVN Rev. wymienionej etykieciarki według LUBOŠ Hasko doskonałe wyniki.

<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>
Odpowiedział 04/08/2008 o 14:43
źródło użytkownik

głosy
4

Jeśli wolisz to robić na MSBuildboku nad CCNetconfig, wygląda jak MSBuildwspólnotowego zadań abonenta wewnętrznego SvnVersionzadania może rade.

Odpowiedział 04/08/2008 o 13:03
źródło użytkownik

głosy
4

Znalazłem tego projektu na Google Code. Jest to CCNETplugin do generowania etykietę CCNET.

DLLJest testowany z CCNET 1.3ale działa ze CCNET 1.4dla mnie. Ja z powodzeniem przy użyciu tej wtyczki do znakowania mój build.

Teraz na przekazanie go do MSBuild...

Odpowiedział 04/08/2008 o 12:51
źródło użytkownik

głosy
3

Nie jestem pewien, czy ta praca z CCNET lub nie, ale ja stworzył wersji SVN wtyczki dla budowy Wersja Przyrost projektu na CodePlex. To narzędzie jest bardzo elastyczny i może być skonfigurowany do automatycznego tworzenia numeru wersji dla używasz rewizji svn. To nie wymaga pisania kodu lub edycji xml, więc yay!

Mam nadzieję, że to pomaga!

Odpowiedział 12/04/2010 o 02:04
źródło użytkownik

głosy
3

Dostosowywanie csproj pliki Wygeneruj AssemblyInfo.cs
http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx

Za każdym razem tworzymy nowy projekt C #, Visual Studio umieszcza tam plik AssemblyInfo.cs dla nas. Plik określa Zgromadzenie meta-dane jak jego wersji, konfiguracji lub producenta.

Znaleziono powyższą technikę AssemblyInfo.cs automatycznej generacji wykorzystujących MSBuild. Będzie pisać krótko próbkę.

Odpowiedział 04/08/2008 o 14:22
źródło użytkownik

głosy
3

Ja obecnie „ręcznie” robi to poprzez prebuild-Exec zadanie, używając mojego cmdnetsvnrev narzędzie, ale jeśli ktoś zna lepsze ccnet zintegrowany sposób to zrobić, byłbym szczęśliwy usłyszeć :-)

Odpowiedział 04/08/2008 o 12:41
źródło użytkownik

głosy
2

Nie mam pojęcia, gdzie znalazłem to. Ale znalazłem to w internecie „gdzieś”.

To aktualizuje wszystkie pliki AssemblyInfo.cs przed kompilacja odbywa.

Działa jak marzenie. Wszystkie moje exe i pokazać się jako 1.2.3.333 DLL (Jeśli „333” była rewizja SVN w czasie.) (A oryginalna wersja w pliku AssemblyInfo.cs został wymieniony jako „1.2.3.0”)


$ (ProjectDir) (gdzie mieszka mój plik .sln)

$ (SVNToolPath) (punkty svn.exe)

moje zmienne niestandardowe, ich deklaracje / definicje nie są zdefiniowane poniżej.


http://msbuildtasks.tigris.org/ i / lub https://github.com/loresoft/msbuildtasks ma (FileUpdate and SvnVersion) zadania.


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

EDYTOWAĆ ------------------------------------------------- -

Powyższe może rozpocząć braku po twój numer wersji SVN osiągnie 65534 lub wyższej.

Widzieć:

Wyłącz CS1607 ostrzegawczy

Oto obejście.

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

Wynik ten powinien być:

W Windows / Explorer // Plik / Właściwości .......

Wersja montaż będzie 1.0.0.0.

File Version będzie 1.0.0.333 jeśli 333 jest rewizja SVN.

Odpowiedział 18/09/2012 o 18:18
źródło użytkownik

głosy
2

W oparciu o rozwiązania skolimas zaktualizowałem skrypt NANT również zaktualizować AssemblyFileVersion. Dzięki skolima kodu!

<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>
Odpowiedział 12/09/2009 o 11:03
źródło użytkownik

głosy
2

Moje podejście jest użycie wspomnianej wtyczki dla ccnet i zadania nant echa, aby wygenerować VersionInfo.csplik zawierający nic ale atrybuty wersja. Mam tylko dołączyć VersionInfo.csplik do kompilacji

Echo zadanie po prostu wyjść ciąg daję go do pliku.

Jeżeli istnieje podobny zadanie MSBuild, można użyć tego samego podejścia. Oto małe zadanie nant używać:

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

Spróbuj tego:

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

Należy pamiętać, że nie jestem bardzo kameralny z MSBuild, więc mój skrypt prawdopodobnie nie działa out-of-the-box i wymagają poprawek ...

Odpowiedział 03/02/2009 o 05:16
źródło użytkownik

głosy
1

Bądź ostrożny. Struktura wykorzystywane do numerach kompilacji jest tylko krótki, więc trzeba pułap jak wysokie rewizja może iść.

W naszym przypadku mamy już przekroczony limit.

Jeśli spróbujesz wprowadzić numer kompilacji 99.99.99.599999 właściwość wersja pliku będzie faktycznie wyjdzie jak 99.99.99.10175.

Odpowiedział 03/02/2009 o 19:34
źródło użytkownik

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