2009-09-16 17 views
39

Làm thế nào bạn sẽ viết một tập tin build.xml, sử dụng không phải mã tùy chỉnh cũng không phụ thuộc bên ngoài (như một kịch bản shell), rằng:số tích xây dựng: major.minor.revision

  • Tạo xây dựng một số dạng lớn .minor.revision (ví dụ: 01.02.34).
  • Tự động gia tăng bản sửa đổi trên mỗi biên dịch mã nguồn.
  • Tự động gia tăng phiên bản phụ trên mỗi lần thực hiện tác vụ của lệnh phân biệt (sườn).

Ngoài ra:

  • Cung cấp một tùy chọn để tăng số lớn.
  • Cung cấp tùy chọn để tăng số phụ.
  • Bất cứ khi nào số lượng lớn được tăng lên, trẻ vị thành niên và điều chỉnh con số này được thiết lập là 0.
  • Bất cứ khi nào số trẻ vị thành niên tăng lên, số phiên bản được thiết lập để 0.

Bonus:

  • Tạo biến dựa trên số sửa đổi git (như số sửa đổi lật đổ).

Làm rõ:

  • Tự động kiểm tra (hoặc cam kết) là không cần thiết.
  • Tích hợp với Subversion không được mong muốn.

Cảm ơn bạn về mọi ví dụ. Dưới đây là một số trang web có liên quan mô tả cách thực hiện các tác vụ tương tự:

Trả lời

53

File build_info.properties:

build.major.number=00 
build.revision.number=00 
build.minor.number=00 

Các build.xml file:

<?xml version="1.0" encoding="UTF-8"?> 
<project name="project" default="current-number"> 

<property file="build_info.properties"/> 
<property name="build.number" value="${build.major.number}.${build.minor.number}.${build.revision.number}"/> 

<target name="current-number"> 
<echo>Current build number:${build.number}</echo> 
</target> 

<target name="compile"> 
    <antcall target="revision"></antcall> 
</target> 

<target name="dist"> 
    <antcall target="minor"></antcall> 
</target> 

<target name="revision"> 
    <propertyfile file="build_info.properties"> 
      <entry key="build.revision.number" type="int" operation="+" value="1" pattern="00"/> 
    </propertyfile> 
</target> 

<target name="minor"> 
    <propertyfile file="build_info.properties"> 
      <entry key="build.minor.number" type="int" operation="+" value="1" pattern="00"/> 
      <entry key="build.revision.number" type="int" value="0" pattern="00"/> 
    </propertyfile> 
</target> 

<target name="major"> 
    <propertyfile file="build_info.properties"> 
      <entry key="build.major.number" type="int" operation="+" value="1" pattern="00"/> 
      <entry key="build.minor.number" type="int" value="0" pattern="00"/> 
      <entry key="build.revision.number" type="int" value="0" pattern="00"/> 
    </propertyfile> 
</target> 

<target name="all"> 
    <propertyfile file="build_info.properties"> 
      <entry key="build.major.number" type="int" operation="+" value="1" pattern="00"/> 
      <entry key="build.minor.number" type="int" operation="+" value="1" pattern="00"/> 
      <entry key="build.revision.number" type="int" operation="+" value="1" pattern="00"/> 
    </propertyfile> 
</target> 

</project> 
+0

Bạn có thể giải thích cách 'major',' minor' và 'revision' được tăng lên không? Tôi hiểu các nhiệm vụ '', nhưng tôi không biết khi nào các mục tiêu được gọi. Nó chỉ dành cho Java? Tôi muốn làm những điều như vậy với dự án plugin jQuery (xây dựng với trình biên dịch đóng cửa), là nó có thể? – Wirone

+0

@Wirone Điều này giải thích một chút, mặc dù tôi không chắc nhiệm vụ "phân phối" là gì: http://en.wikipedia.org/wiki/Software_versioning –

+0

Tôi đã sử dụng tập lệnh kiến ​​này, vấn đề của tôi là tôi xuất một tập tin jar sau đó. Nhưng số phiên bản trong tệp thuộc tính chưa được cập nhật khi tôi tạo jar. Tôi sử dụng versionnumber trong tên tệp jar của tôi – user2071938

3

Process xây dựng

  1. build_info.properties sẽ được tạo ra trong quá trình xây dựng trong thư mục dự án của bạn Bạn có thể viết tất cả các thông tin về xây dựng của bạn trong tập tin này.
    • Giống như số bản dựng, số lớn, số phát hành, dấu thời gian và số sửa đổi nhỏ.
  2. xây dựng kịch bản của bạn có thể sửa đổi các giá trị như thế nào bao giờ bạn muốn
  3. Sau khi xây dựng đã thành công cam kết tập tin 'build_info.lại tính đến kho

Trong Phát triển

Sau lần đầu tiên xây dựng build_info.properties tập tin sẽ được đặt trong kho. Bạn có thể thay đổi và cam kết bất kỳ số nào (chính, nhỏ, số xây dựng) theo chính bạn khi nào bạn muốn hoặc tăng tự động trong khi tạo như build.number trong ví dụ bên dưới.

svnant Ví dụ

Sử dụng svnant 1.3.0:

<target name="checkout"> 
    <echo>Checking out revision ${param_SubProjectSvnREV} of project: ${param_SubProjectSvnName}</echo> 
    <svn username="${svnant.repository.user}" password="${svnant.repository.passwd}"> 
     <checkout url="${svnant.latest.url}/${param_SubProjectSvnName}/" revision="${param_SubProjectSvnREV}" destPath="${all.projects.dir}/${param_SubProjectDirName}" /> 
     <info target="${all.projects.dir}/${param_SubProjectDirName}" ></info> 
    </svn> 
    <propertyfile file="${all.projects.dir}/${param_SubProjectDirName}/build_info.properties" comment="Modify build numbers in a properties file."> 
     <entry key="build.number" type="int" operation="+" value="1" pattern="00"/><!--increment it here --> 
     <entry key="build.revision" type="string" value="${svn.info.rev}"/> 
     <entry key="build.major.number" default="01"/><!-- can do some logic here to increase the values, or write value from somewhere else--> 
     <entry key="build.minor.number" default="01"/><!-- can do some logic here to increase the values, or write value from somewhere else--> 
    </propertyfile> 
</target> 

<target name="compile" depends="checkout"> 
    <property file="${all.projects.dir}/${param_SubProjectDirName}/build_info.properties" /> 
    <mkdir dir="${release.name}/${param_SubProjectDirName}/${build.major.number}.${build.minor.number}.${build.number}" /> 
    <!-- compile it to the new folder, an so on... --> 
    <!-- after all, if the build wass successfull, commit the file 'build_info.properties' back to repository --> 
</target> 
0

Trong dự án của tôi không tăng số lượng nhỏ và lớn tự động. Chúng tôi đặt nó từ các thuộc tính xây dựng toàn cầu của mình. Như thế:

<entry key="build.major.number" value="${global.release.major}"></entry> 
<entry key="build.minor.number" value="${global.release.minor}"></entry> 

Đó là bởi vì họ sẽ được thay đổi cho phiên bản (không phải cho thử nghiệm hoặc xây dựng khác) và cam kết cùng với các nguồn khác (chúng ta có thể xây dựng một số phiên bản cũ hoặc chi nhánh).

Nhưng nếu bạn muốn tăng số nhỏ, bạn có thể làm như số xây dựng trong ví dụ của tôi.

<entry key="build.major.number" type="int" operation="+" default="1" pattern="00"/> 
0

Cách dễ nhất để thực hiện việc này là thay đổi sự cố. Thay vì tạo bất kỳ công trình Xây dựng nào làm điều này cho bạn, hãy thực hiện bất kỳ quy trình nào mà bạn đang gọi là Ant tính toán số phiên bản sẽ là gì và sau đó chuyển số đó vào làm thuộc tính, ví dụ:

kiến ​​-Dbuild.version = 1.2.3

này có sự linh hoạt của bất cứ tòa nhà, bạn đang làm việc với việc có thể lấy tín hiệu từ bất cứ điều gì, chẳng hạn như các phiên bản SVN, ngày hiện tại và thời gian, hay bất cứ cái gì.

kiến ​​-Dbuild.version = svnversion .

kiến ​​-Dbuild.version = date +"%Y%m%d%H%D"

kiến ​​-Dbuild.version = $ {} lớn. svnversion .. date +"%Y%m%d%H%D"

v.v. Bạn có thể nhận được khá toàn diện nếu bạn muốn.

Nếu bạn muốn có con số tăng dần, thì bạn có thể lưu nó vào một tệp và sau đó chuyển nó vào lúc biên dịch. Ví dụ, bạn có thể làm:

VER = cat build.version VER = $ ((VER + 1)) echo $ VER> build.version

Cuối cùng, nếu bạn thực sự muốn điều này để được trong xây dựng. tập tin xml, điều tốt nhất cần làm là có một nhiệm vụ riêng biệt để thực thi tùy chọn gia tăng và xây dựng và tháo bỏ kiến ​​xây dựng lồng với mục tiêu 'chính' của bạn. do đó bạn muốn kết thúc với

ant -> -Dbuild.version ant = 1.2.3.4 -> ...

Nói cách khác, cho build.xml của bạn với một (hiện tại) mặc định của 'xây dựng ', sau đó thay đổi nó thành' phiên bản 'và có tác vụ phiên bản kiến ​​làm việc tính toán theo sau là một cuộc gọi lồng nhau và xây dựng.

Thực hiện được để lại như một bài tập cho người đọc, cũng như dịch cách tiếp cận sang nền tảng không phải UNIX.

+0

Hãy nhớ rằng Git không có khái niệm về số phiên bản gia tăng. Các bản sửa đổi Git là các băm SHA và không phải là số (thông thường, chúng được biểu diễn bằng hex, mặc dù tất nhiên nó đại diện cho một số dưới các bìa). Tuy nhiên, điều quan trọng quan trọng là nó không phải là một số lượng ngày càng tăng, nhưng thay vì phải nhảy vọt (cả lên và xuống) trên phổ số. Ngoài ra, các ràng buộc bạn đưa vào yêu cầu không nhất quán.Bạn không muốn bất kỳ phụ thuộc bên ngoài, nhưng bạn đã có Git, và có lẽ Ant là tốt. – AlBlue

+0

Git không có khái niệm tăng số. Bạn gắn thẻ (đúng cách, sử dụng -s hoặc -a) khi bạn có phiên bản thú vị. Bạn sử dụng 'mô tả' để có được một số phiên bản duy nhất, có thể đọc được từ con người của bạn. – Dustin

+0

Dustin, Số phiên bản thu được bằng git mô tả không phải là duy nhất trên tất cả các kho được phân phối; và trong mọi trường hợp, là sự kết hợp của thẻ và số lần commit đến kho lưu trữ (cục bộ) kể từ đó. Những thứ như rebasing hoặc squashing cam kết có thể dẫn đến con số giống hệt nhau nhưng nội dung khác nhau. – AlBlue

4

Giải pháp này không nhỏ tăng hoặc sửa đổi số tự động nếu một biên dịch hay một mục tiêu quận đã được chọn. Các incrementation có thể được tắt nếu một trong những đặc tính sau đây đã được thiết lập:

  • -Dno.increment.minor = true
  • -Dno.increment.revision = true

Nếu tài sản inc.major đã được thiết lập, sau đó số chính sẽ được tăng lên và cả hai giá trị khác sẽ được đặt thành 0. Kiểm tra SHA-1 đang được tính toán bằng cách trình bày văn bản của tệp phiên bản.

Bằng cách này: Nếu có thể đã được cho phép, bạn có thể tạo lệnh ant của riêng bạn trong kịch bản java, được bao gồm trong JDK 6.

Bây giờ đây là kiến ​​tập

<?xml version="1.0" encoding="UTF-8"?> 
<project name="Numbers" default="dist" basedir="."> 

    <property name="version.file" location="${basedir}/version.properties"/> 

    <target name="inc.revision.properties" unless="no.increment.revision"> 
     <propertyfile file="${version.file}"> 
      <entry key="minor.number" default="00" operation="=" pattern="00" type="int"/> 
      <entry key="major.number" default="00" operation="=" pattern="00" type="int"/> 
      <entry key="build.number" default="00" operation="+" pattern="00" type="int"/> 
     </propertyfile> 
    </target> 

    <target name="inc.minor.properties" unless="no.increment.minor"> 
     <propertyfile file="${version.file}"> 
      <entry key="minor.number" default="00" operation="+" pattern="00" type="int"/> 
      <entry key="major.number" default="00" operation="=" pattern="00" type="int"/> 
      <entry key="build.number" value="00" operation="=" type="int"/> 
     </propertyfile> 
    </target> 

    <target name="inc.major" if="inc.major"> 
     <property name="no.increment.minor" value="true" /> 
     <property name="no.increment.revision" value="true" /> 
     <propertyfile file="${version.file}"> 
      <entry key="minor.number" value="00" operation="=" pattern="00" type="int"/> 
      <entry key="major.number" default="00" operation="+" pattern="00" type="int"/> 
      <entry key="build.number" value="00" operation="=" pattern="00" type="int"/> 
     </propertyfile> 
     <load.version.info/> 
    </target> 

    <target name="inc.minor" depends="inc.major,inc.minor.properties"> 
     <property name="no.increment.revision" value="true"/> 
     <load.version.info/> 
    </target> 

    <target name="inc.revision" depends="inc.major,inc.revision.properties"> 
     <load.version.info/> 
    </target> 

    <macrodef name="load.version.info"> 
     <sequential> 
      <property file="${version.file}"/> 
      <checksum file="${version.file}" property="sha1.number" algorithm="SHA" format="CHECKSUM"/> 
      <echo>Version: ${major.number}.${minor.number}.${build.number}</echo> 
      <echo>SHA1: ${sha1.number}</echo> 
     </sequential> 
    </macrodef> 

    <target name="compile" depends="inc.revision" description="Compile Task"/> 

    <target name="dist" depends="inc.minor, compile" description="Dest Task"/> 

</project> 
+0

sử dụng mọi thứ trở nên dễ dàng hơn nhiều. Nhưng việc tính toán tổng kiểm tra SHA1 mà không có tệp tổng hợp trong tệp không phải là một tùy chọn. Quy tắc cũ của tôi trở thành sự thật: các tác vụ tùy chọn làm cho giải pháp phức tạp hơn. –

0

Đây là cách đây không lâu, vì vậy đây là từ bộ nhớ:

Tôi xây dựng một khối cửa hàng của CruiseControl.Net tùy chỉnh đánh dấu vào số bản dựng trên mỗi bản dựng. Nó duy trì một tập tin XML với tất cả 4 thành phần của số phiên bản và xác định từng dự án theo tên (vì vậy nó có thể hỗ trợ nhiều dự án).

Bốn giá trị mà nó tạo ra được chuyển đến quy trình xây dựng (nAnt, trong trường hợp của chúng tôi), có trách nhiệm tinh chỉnh tất cả các tệp AssemblyInfo.cs để phản ánh đúng số bản dựng.

Đã chỉnh sửa để lưu ý: Giá trị duy nhất được tự động đánh dấu là số bản dựng. Các số phiên bản chính/nhỏ được chỉ định trong cấu hình dự án CC.Net. Số bản dựng được khởi động lại lúc 0001 cho mỗi thay đổi trong số sửa đổi lớn hoặc nhỏ (ví dụ: nếu bạn đã chuyển từ phiên bản 7.1 sang phiên bản 7.3, ví dụ, bản dựng 7.1 có thể ở số bản dựng 783, nhưng bản dựng 7.3 đầu tiên bắt đầu bằng số bản dựng 1; 7.1 build tiếp theo sẽ được xây dựng 784.

số thay đổi phiên bản chỉ cần tinh chỉnh 1 thiết lập các tập tin cấu hình CC.Net

0

chúng ta có thể sử dụng điều kiện để kiểm tra xem chúng ta nên tăng vi mô, nhỏ và lớn. phiên bản

Tăng nhỏ nếu vi là 9, v.v.

 <target name="increaseBuildNumber" depends="increase.micro, increase.minor, increase.major" description="Increase Build Number"/> 

     <target name="increase.micro" if ="microNotEquals9"> 
      <propertyfile file="build.properties"> 
       <entry key="micro.number" default="0" operation="+" pattern="0" type="int"/> 
      </propertyfile> 

    </target> 

    <target name="increase.minor" if = "microEquals9andMinorNotEquals9"> 
      <propertyfile file="build.properties"> 
       <entry key="minor.number" default="0" operation="+" pattern="0" type="int"/> 
       <entry key="micro.number" value="0" operation="=" pattern="0" type="int"/> 
      </propertyfile> 

    </target> 

    <target name="increase.major" if = "microAndMinorEquals9" > 
      <propertyfile file="build.properties"> 
       <entry key="major.number" default="0" operation="+" pattern="0" type="int"/> 
       <entry key="minor.number" value="0" operation="=" pattern="0" type="int"/> 
       <entry key="micro.number" value="0" operation="=" pattern="0" type="int"/> 
      </propertyfile> 


    </target> 

    <condition property="minorEquals9"> 
      <equals arg1="${minor.number}" arg2="9"/> 
    </condition> 

    <condition property="microEquals9andMinorNotEquals9"> 
      <and> 
       <equals arg1="${micro.number}" arg2="9"/> 
       <not><equals arg1="${minor.number}" arg2="9"/></not> 
      </and> 
    </condition> 

    <condition property="microAndMinorEquals9"> 
      <and> 
       <equals arg1="${micro.number}" arg2="9"/> 
       <equals arg1="${minor.number}" arg2="9"/> 
      </and> 
    </condition> 

    <condition property="microNotEquals9"> 
      <not><equals arg1="${micro.number}" arg2="9"/></not> 
    </condition>