2008-08-04 32 views
39

Tôi đang sử dụng CCNET trên một dự án mẫu với SVN làm kiểm soát nguồn của tôi. CCNET được cấu hình để tạo một bản dựng trên mỗi lần kiểm tra. CCNET sử dụng MSBuild để xây dựng mã nguồn.Sử dụng sửa đổi SVN để tạo nhãn trong CCNET

Tôi muốn sử dụng số sửa đổi mới nhất để tạo AssemblyInfo.cs khi biên soạn. Làm cách nào tôi có thể truy xuất bản sửa đổi mới nhất từ ​​bản lật đổ và sử dụng giá trị trong CCNET?

Chỉnh sửa: Tôi không sử dụng NAnt - chỉ MSBuild.

Trả lời

44

CruiseControl.Net 1.4.4 hiện có số Assembly Version Labeller, tạo số phiên bản tương thích với thuộc tính assembly .Net.

Trong dự án của tôi, tôi có nó cấu hình như:

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

(Nên biết trước:. assemblyVersionLabeller sẽ không bắt đầu tạo nhãn svn sửa đổi dựa cho đến một thực tế cam kết-kích hoạt xây dựng xảy ra)

và sau đó tiêu thụ điều này từ các dự án MSBuild của tôi với 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> 

Vì mục đích hoàn thành, thật dễ dàng cho các dự án sử dụng NAnt inste quảng cáo của 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> 
+3

+1 Tuyệt vời, điều này đã giúp tôi rất nhiều. Tôi đã cập nhật phiên bản của bạn cho NAnt để cũng cập nhật AssemblyFileVersion và một số thứ nhỏ nhặt. Nó được bao gồm như là một câu trả lời ở đây trong chủ đề này. Cảm ơn! – galaktor

+0

Những người khác không nên giảm giá mà báo trước; rất quan trọng. Kết quả là, có rất nhiều câu trả lời trên web nói rằng điều này không hoạt động. Vẫn còn có vẻ lỗi, nhưng kích hoạt mà xây dựng trên một kiểm tra trong một lần và tất cả mọi thứ hoạt động như mong đợi ở đó sau. - Cảm ơn một bó – Chuck

+0

Liên kết tới phiên bản Assembly Labeller bị hỏng. – stephen

3

Tôi hiện đang "thực hiện" thủ công thông qua tác vụ prebuild-exec, sử dụng công cụ cmdnetsvnrev của mình, nhưng nếu ai đó biết cách tích hợp CCnet tốt hơn, tôi rất vui khi nghe :-)

4

Tôi đã tìm thấy dự án this trên mã google. Đây là plugin CCNET để tạo nhãn trong CCNET.

DLL được kiểm tra với CCNET 1.3 nhưng nó hoạt động với CCNET 1.4 đối với tôi. Tôi đang sử dụng thành công plugin này để gắn nhãn cho bản dựng của mình.

Bây giờ, hãy chuyển nó tới MSBuild ...

14

Bạn có hai lựa chọn cơ bản. Hoặc là bạn viết một kịch bản đơn giản mà sẽ bắt đầu phân tích và đầu ra từ

thông tin svn.exe --revision ĐẦU

để có được số phiên bản (AssemblyInfo.cs sau đó tạo ra là khá nhiều thẳng về phía trước) hoặc chỉ sử dụng plugin cho CCNET. Ở đây là:

SVN sửa đổi -máy dán nhãn là một plugin cho CruiseControl.NET cho phép bạn tạo ra nhãn CruiseControl cho bạn xây dựng, dựa trên số sửa đổi của Subversion của bạn bản sao làm việc. Bạn có thể tùy chỉnh này bằng một tiền tố và/hoặc các số phiên bản chính/nhỏ.

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

Tôi thích tùy chọn đầu tiên bởi vì nó chỉ khoảng 20 dòng mã:

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

Nếu bạn thích làm việc đó trên MSBuild bên trong CCNet cấu hình, trông giống như MSBuild Nhiệm vụ SvnVersion của Công việc cộng đồng có thể thực hiện thủ thuật.

3

Tùy csproj file để autogenerate AssemblyInfo.cs
http://www.codeproject.com/KB/dotnet/Customizing_csproj_files.aspx

Mỗi lần chúng tôi tạo ra một C# dự án mới, Visual Studio đặt có file AssemblyInfo.cs cho chúng ta. Tệp xác định siêu dữ liệu lắp ráp như phiên bản, cấu hình hoặc nhà sản xuất của nó.

Tìm thấy kỹ thuật trên để tự động tạo AssemblyInfo.cs bằng MSBuild. Sẽ gửi mẫu ngay.

4

Tôi đã viết tệp xây dựng NAnt xử lý phân tích cú pháp thông tin SVN và tạo thuộc tính. Sau đó, tôi sử dụng các giá trị thuộc tính đó cho nhiều tác vụ xây dựng khác nhau, bao gồm đặt nhãn trên bản dựng. Tôi sử dụng mục tiêu này kết hợp với SVN Revision Labeller được đề cập bởi lubos hasko với kết quả tuyệt vời.

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

Biện pháp của tôi là sử dụng các plugin nói trên cho ccnet và một nhiệm vụ vang Nant để tạo ra một tập tin VersionInfo.cs gì chứa nhưng các thuộc tính phiên bản. Tôi chỉ phải bao gồm tệp VersionInfo.cs vào công cụ xây dựng

Tác vụ echo chỉ cần xuất ra chuỗi mà tôi đưa nó vào tệp.

Nếu có một tác vụ MSBuild tương tự, bạn có thể sử dụng cùng một cách tiếp cận. Đây là nhiệm vụ Nant nhỏ tôi sử dụng:

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

Hãy thử điều này:

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

Xin lưu ý rằng tôi không phải là rất thân mật với MSBuild, vì vậy kịch bản của tôi có thể sẽ không làm việc out-of-the- và cần chỉnh sửa ...

1

Hãy cẩn thận. Cấu trúc được sử dụng cho số xây dựng chỉ là một đoạn ngắn để bạn có mức trần về mức độ sửa đổi của bạn có thể tăng bao nhiêu.

Trong trường hợp của chúng tôi, chúng tôi đã vượt quá giới hạn.

Nếu bạn cố gắng đưa vào số bản dựng 99.99.99.599999, thuộc tính phiên bản tệp sẽ thực sự xuất hiện dưới dạng 99,99,99.10175.

+0

không phải là trường hợp System.Version chỉ định. Bản sửa đổi là một int32 và vì vậy bạn có thể đọc mà không phải là nhỏ và lớn mà là một khẩu trang Int32 mặt nạ thành ngắn. –

2

Dựa trên giải pháp skolimas Tôi đã cập nhật tập lệnh NAnt để cập nhật AssemblyFileVersion. Nhờ skolima cho mã!

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

Tôi không chắc chắn nếu công việc này với CCNET hay không, nhưng tôi đã tạo ra một SVN version plug-in cho dự án Build Version Increment trên CodePlex. Công cụ này khá linh hoạt và có thể được thiết lập để tự động tạo một số phiên bản cho bạn bằng cách sử dụng sửa đổi svn. Nó không yêu cầu viết bất kỳ mã hoặc chỉnh sửa xml, do đó, yay!

Tôi hy vọng điều này sẽ hữu ích!

2

Không biết tôi đã tìm thấy thông tin này ở đâu. Nhưng tôi tìm thấy điều này trên internet "một nơi nào đó".

Điều này cập nhật tất cả các tệp AssemblyInfo.cs trước khi quá trình tạo diễn ra.

Hoạt động như một sự quyến rũ. Tất cả các exe và dll của tôi hiển thị như 1.2.3.333 (Nếu "333" là bản sửa đổi SVN tại thời điểm đó.) (Và phiên bản gốc trong tệp AssemblyInfo.cs được liệt kê là "1.2.3.0")


$ (ProjectDir) (Nơi file sln tôi cư trú)

$ (SVNToolPath) (điểm để svn.exe)

là các biến tùy chỉnh của tôi thì trong tờ khai/định nghĩa không được định nghĩa dưới đây.


http://msbuildtasks.tigris.org/ và/hoặc https://github.com/loresoft/msbuildtasks có nhiệm vụ (FileUpdate và 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> 

EDIT --------------------------------------- -----------

Ở trên có thể bắt đầu thất bại sau khi số sửa đổi SVN của bạn đạt 65534 hoặc cao hơn.

Xem:

Turn off warning CS1607

Dưới đây là cách giải quyết.

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

Kết quả của việc này sẽ là:

Trong Windows/Explorer // File/Thuộc tính .......

Phiên bản hội sẽ là 1.0.0.0.

Phiên bản tệp sẽ là 1.0.0.333 nếu 333 là bản sửa đổi SVN.

+0

Tôi nghĩ rằng tôi đã tìm thấy nơi ban đầu tôi tìm thấy nó: http://geekswithblogs.net/mnf/archive/2009/07/03/msbuild-task-to-replace-content-in-text-files.aspx – granadaCoder

Các vấn đề liên quan