سؤال

أنا باستخدام CCNET على عينة المشروع مع SVN بلدي عنصر تحكم مصدر.CCNET تكوين لإنشاء بناء على كل تسجيل الوصول.CCNET يستخدم MSBuild لبناء البرمجية المصدر.

وأود أن استخدام أحدث مراجعة عدد لتوليد AssemblyInfo.cs أثناء ترجمة.كيف يمكنني استرداد أحدث مراجعة من التخريب واستخدام القيمة في CCNET?

تحرير:أنا لا تستخدم نانت - فقط MSBuild.

هل كانت مفيدة؟

المحلول

CruiseControl.Net 1.4.4 لديها الآن إصدار التجميع وصفها, الذي يولد أرقام إصدار متوافق مع .صافي الجمعية خصائص.

في مشروعي هذا تكوينه:

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

(التحذير: assemblyVersionLabeller لن تبدأ توليد svn revision على أساس التسميات حتى فعلية ارتكاب أثار بناء يحدث.)

ثم تستهلك هذه من MSBuild المشاريع 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>

من أجل completness, انها مجرد من السهل على المشاريع باستخدام نانت بدلا من 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>

نصائح أخرى

لديك أساسا اثنين من الخيارات.إما أن تكتب سيناريو بسيط من شأنها أن تبدأ وتحليل الناتج من

svn.exe معلومات --مراجعة رئيس

للحصول على رقم المراجعة (ثم توليد AssemblyInfo.cs هو الى حد كبير على التوالي إلى الأمام) أو مجرد استخدام البرنامج المساعد CCNET.هنا هو:

SVN Revision وصفها هو البرنامج المساعد ل CruiseControl.الشبكة التي تسمح لك توليد CruiseControl التسميات الخاصة بك يبني بناء على مراجعة عدد من التخريب نسخة العمل.هذا يمكن أن تكون مخصصة مع بادئة و/أو الرئيسية/طفيفة أرقام إصدار.

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

أنا أفضل الخيار الأول لأنه فقط تقريبا 20 خطوط من التعليمات البرمجية:

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

لقد كتبت نانت بناء الملف الذي يتعامل مع تحليل إس المعلومات وخلق خصائص.ثم استخدام تلك الخاصية القيم لمجموعة متنوعة من بناء المهام ، بما في ذلك وضع ملصق على بناء.يمكنني استخدام هذا الهدف جنبا إلى جنب مع SVN Revision وصفها ذكرها لوبوس hasko مع نتائج عظيمة.

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

وجدت هذا مشروع مدونة جوجل.هذا هو CCNET المساعد لتوليد التسمية في CCNET.

على DLL هو اختبار مع CCNET 1.3 لكنه يعمل مع CCNET 1.4 بالنسبة لي.انا بنجاح باستخدام هذا البرنامج المساعد تسمية بلدي بناء.

الآن على تمرير ذلك إلى MSBuild...

إذا كنت تفضل القيام بذلك على MSBuild الجانب على CCNet التكوين, يبدو أن MSBuild المجتمع المهام الإضافة SvnVersion المهمة قد تفعل خدعة.

أنا حاليا "يدويا" نفعل ذلك من خلال prebuild-exec المهمة ، باستخدام بلدي cmdnetsvnrev أداة, ولكن إذا كان أي شخص يعرف أفضل ccnet متكاملة طريقة للقيام بذلك سأكون سعيدا لسماع :-)

تخصيص csproj الملفات إلى autogenerate AssemblyInfo.cs
http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx

في كل مرة نقوم بإنشاء برنامج C# المشروع ، Visual Studio يضع هناك AssemblyInfo.cs الملف بالنسبة لنا.الملف تحدد الجمعية البيانات الوصفية مثل نسخته ، التكوين ، أو منتج.

وجدت أعلاه تقنية السيارات-gen AssemblyInfo.cs باستخدام MSBuild.سيتم نشر عينة قريبا.

لست متأكدا إذا كان هذا العمل مع CCNET أم لا ، لقد خلقت إس النسخة المكونات في عن بناء النسخة الاضافة مشروع CodePlex.هذا هو أداة مرنة جدا و يمكن تعيين تلقائيا إنشاء نسخة رقم باستخدام svn revision.أنها لا تتطلب كتابة أي رمز أو تحرير xml ، لذلك ياي!

آمل أن يكون هذا هو يساعد!

توجهي هو استخدام المذكور المساعد ccnet و نانت صدى مهمة لتوليد VersionInfo.cs ملف يحتوي على أي شيء ولكن النسخة الصفات.أنا فقط يجب أن تشمل VersionInfo.cs الملف في بناء

صدى المهمة ببساطة إخراج سلسلة أعطي إلى ملف.

إذا كان هناك مماثلة MSBuild المهمة ، يمكنك استخدام نفس النهج.وهنا الصغيرة نانت المهمة يمكنني استخدام:

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

جرب هذا:

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

يرجى ملاحظة أنني لا حميمة جدا مع MSBuild ، لذلك السيناريو المحتمل أن لا تعمل خارج المربع و تحتاج التصحيحات...

على أساس skolimas الحل لقد قمت بتحديث نانت النصي أيضا تحديث AssemblyFileVersion.بفضل skolima للحصول على التعليمات البرمجية!

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

أي فكرة من أين وجدت هذا.ولكن لقد وجدت هذا على الإنترنت "في مكان ما".

هذه التحديثات كل AssemblyInfo.cs الملفات قبل بناء يأخذ مكان.

تعمل مثل السحر.كل exe و dll تظهر كما 1.2.3.333 (إذا كان "333" كانت SVN revision في ذلك الوقت.) (و النسخة الأصلية في AssemblyInfo.cs ملف اسمه "1.2.3.0")


$(ProjectDir) (حيث بلدي .sln يوجد ملف)

$(SVNToolPath) (نقطة svn.exe)

هي عادتي المتغيرات ، إعلاناتها/تعريفات غير المحددة أدناه.


http://msbuildtasks.tigris.org/ و/أو https://github.com/loresoft/msbuildtasks له ( FileUpdate و 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>

تحرير --------------------------------------------------

أعلاه قد تبدأ الفشل بعد SVN revision عدد يصل إلى 65534 أو أعلى.

انظر:

إيقاف تحذير CS1607

هنا هو الحل.

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

ونتيجة لهذا يجب أن تكون:

في نظام التشغيل Windows/Explorer//File/خصائص.......

الجمعية ستكون نسخة 1.0.0.0.

إصدار الملف سوف يكون 1.0.0.333 إذا 333 هي SVN revision.

كن حذرا.بنية استخدامها لبناء الأرقام هي سوى فترة قصيرة حتى يكون لديك السقف على مدى ارتفاع المراجعة الخاصة بك يمكن أن تذهب.

في حالتنا نحن بالفعل تجاوز الحد.

إذا كنت في محاولة لوضعها في بناء عدد 99.99.99.599999, إصدار الملف الملكية سوف تأتي في الواقع كما 99.99.99.10175.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top