Ccnet inşa etiketlemek için SVN Revision kullanın

oy
39

Benim kaynak kontrolü gibi SVN ile örnek bir proje üzerinde ccnet kullanıyorum. CCNET her çek için yapı oluşturmak üzere yapılandırılmıştır. CCNET kaynak kodunu oluşturmak için MSBuild kullanır.

Ben üretmek için en son revizyon numarasını kullanmak istiyorum AssemblyInfo.csderlenirken. Nasıl tahrip son revizyon almak ve ccnet değeri kullanabilir?

Düzenleme: NAnt kullanmıyorum - sadece MSBuild.

Oluştur 04/08/2008 saat 12:37
kaynak kullanıcı
Diğer dillerde...                            


12 cevaplar

oy
44

CruiseControl.Net 1.4.4 şimdi sahiptir Montaj Versiyon etiketleyiciyi Net montaj özellikleri ile uyumlu sürüm numaraları üretir.

Projemde o kadar yapılandırmış:

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

(Uyarı: assemblyVersionLabellergerçek bir tamamlama tetiklenen yapı oluşana kadar svn düzeltme göre etiketleri ile başlamaz.)

ve sonra benim MSBuild projelerden bu tüketmek 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>

tamlanışını uğruna, sadece yerine MSBuild ait NAnt kullanarak projeler için aynı derecede basittir:

<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>
Cevap 10/06/2009 saat 13:37
kaynak kullanıcı

oy
14

Temelde iki seçeneğiniz vardır. Ya başlayıp çıktı ayrıştırmak basit bir senaryo yazmak

svn.exe bilgi --revision BAŞ

düzeltme numarası elde etmek için (daha sonra AssemblyInfo.cs üretilmesi oldukça fazla yalındır) ya da sadece ccnet eklentisi kullanılır. İşte burada:

SVN Revizyon Etiketleme senin Subversion çalışma kopyasının revizyon numarasına dayanarak inşa için size CruiseControl etiketleri oluşturmasına olanak sağlar CruiseControl.NET için bir eklenti. Bu önek ve / veya majör / minör sürüm numaraları ile özelleştirilebilir.

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

koddan sadece kabaca 20 satır çünkü ben ilk seçeneği tercih:

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();
        }
    }
}
Cevap 04/08/2008 saat 12:56
kaynak kullanıcı

oy
4

SVN bilgisini ayrıştırma ve özellikleri oluşturarak işleyen bir NAnt yapı dosyası yazdım. Sonra yapı üzerinde etiket ayarlama gibi inşa çeşitli görevleri için bu özellik değerlerini kullanır. Ben mükemmel sonuçlar ile lubos hasko bahsettiği SVN Revizyon Labeller'da ile kombine bu hedefi kullanır.

<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>
Cevap 04/08/2008 saat 14:43
kaynak kullanıcı

oy
4

Eğer bunu yapmayı tercih ederim Eğer MSBuildüzerinde yan CCNetgeneli, benziyor MSBuildTopluluk Görevleri uzantının SvnVersionhile yapabilir görev.

Cevap 04/08/2008 saat 13:03
kaynak kullanıcı

oy
4

Bulduğum bu google kodu projeyi. Bu edilir CCNETEtiketi oluşturmak için eklentisi CCNET.

DLLIle test edilmiştir CCNET 1.3ancak çalışır CCNET 1.4benim için. Ben başarıyla yapımın üzerinde etiket için bu eklentiyi kullanıyorum.

Şimdi üzerine geçirmeden MSBuild...

Cevap 04/08/2008 saat 12:51
kaynak kullanıcı

oy
3

Emin değilim eğer ccnet ile bu iş ya da değil, ama bir oluşturduk SVN sürüm eklentisini için Yapı Sürüm Artış Codeplex üzerinde proje. Bu araç oldukça esnektir ve otomatik svn revizyon kullanmak için bir sürüm numarası oluşturmak için ayarlanabilir. Bu herhangi bir kod veya düzenleme xml yazma gerekir, bu nedenle yay yok!

Bu yardımcı olur umarım!

Cevap 12/04/2010 saat 02:04
kaynak kullanıcı

oy
3

AutoGenerate AssemblyInfo.cs dosyaları csproj Özelleştirme
http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx

yeni bir C # projesi oluşturmak her zaman, Visual Studio bizim için orada AssemblyInfo.cs dosyasını koyar. Dosya, versiyon, konfigürasyon veya üretici gibi montaj meta verileri tanımlar.

MSBuild kullanarak otomatik gen AssemblyInfo.cs yukarıdaki tekniği bulunamamıştır. kısaca örnek yayınlayacağız.

Cevap 04/08/2008 saat 14:22
kaynak kullanıcı

oy
3

Şu anda "elle" Benim kullanarak, önceden inşa edilmiş-exec Görev yoluyla yapıyorum cmdnetsvnrev aracı, ama birisi onu yapmanın daha iyi ccnet entegre yol biliyor, ben :-) duymak mutlu olurum

Cevap 04/08/2008 saat 12:41
kaynak kullanıcı

oy
2

Ben bu bulunamadı fikir. Ama internet "yerde" üzerinde bulduk.

inşa gerçekleşmeden önce bu tüm AssemblyInfo.cs dosyalarını günceller.

ÇALIŞIYOR bir cazibe gibi. Bütün exe ve dll 'gösterisi yukarı 1.2.3.333 olarak ( "333" anda SVN revizyon olsaydı.) (Ve AssemblyInfo.cs dosyasında orijinal versiyonu "1.2.3.0" olarak yer aldı)


(Benim .Sln dosyasının bulunduğu) $ (ProjectDir)

$ (SVNToolPath) (noktalar svn.exe için)

Benim özel değişkenler, onların beyanlar vardır / tanımları aşağıda tanımlanmamıştır.


http://msbuildtasks.tigris.org/ ve / veya https://github.com/loresoft/msbuildtasks (FileUpdate ve SvnVersion) görevleri vardır.


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

DÜZENLE ------------------------------------------------- -

SVN revizyon numarası 65534 ya da daha yüksek ulaştıktan sonra yukarıdaki başarısız başlayabilir.

Görmek:

Uyarı CS1607 kapatın

İşte çözümdür.

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

Bunun sonucu olmalıdır:

Windows / Explorer // Dosya / Özellikler .......

Montaj Sürüm 1.0.0.0 olacaktır.

333 SVN revizyon ise Versiyon 1.0.0.333 olacak File.

Cevap 18/09/2012 saat 18:18
kaynak kullanıcı

oy
2

skolimas çözümüne dayanan Ayrıca AssemblyFileVersion güncellemek için NAnt komut dosyası güncellendi. Teşekkür kodu için skolima için!

<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>
Cevap 12/09/2009 saat 11:03
kaynak kullanıcı

oy
2

Benim yaklaşım oluşturmak için ccnet ve nant yankı görev için yukarıda belirtilen eklenti kullanmak olduğunu VersionInfo.csversiyonu bağlıyor ancak dosya içeren bir şey. Sadece eklemek zorunda VersionInfo.csyapı içine dosyayı

Yankı görev basitçe bir dosyaya vermek dizgisi verir.

Benzer bir MSBuild görev varsa, aynı yaklaşımı kullanabilirsiniz. Burada kullandığım küçük nant görev:

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

Bunu dene:

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

Benim komut muhtemelen out-of-the-box çalışmak ve düzeltmeler gerek kalmayacaktır yüzden, MSBuild ile çok samimi değilim lütfen unutmayın ...

Cevap 03/02/2009 saat 05:16
kaynak kullanıcı

oy
1

Dikkatli ol. yapı numaraları için kullanılan yapı sadece kısa olduğu böylece revizyon için bir üst bir tavan var.

Bizim durumumuzda, zaten sınırını aştınız.

Eğer yapı numarası 99.99.99.599999 koymak çalışırsanız, dosya sürümü özelliği aslında 99.99.99.10175 olarak çıkacaktır.

Cevap 03/02/2009 saat 19:34
kaynak kullanıcı

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