内部编号:major.minor.revision

你将如何编写一个build.xml文件,既不使用自定义代码,也不使用外部依赖(如shell脚本):

  • 生成formsmajor.minor.revision(例如, 01.02.34 )的内部版本号。
  • 自动递增源代码的每个编译版本。
  • 每次执行dist(分配)任务时自动递增次要版本。

另外:

  • 提供一个选项来增加主号码。
  • 提供一个选项来增加次要号码。
  • 每当主号码增加时,次版本号和修订号都设置为0。
  • 每当次号码增加时,修订号码被设置为0。

奖金:

  • 根据git修订号创build一个variables(如一个颠覆版本号)。

澄清:

  • 自动结账(或提交)不是必需的。
  • 与Subversion的集成是不希望的。

谢谢你的任何例子。 以下是一些描述如何执行类似任务的相关网站:

  • 用Ant创build一个内部版本号 。
  • 使用BuildNumber Ant任务。
  • ant和版本号码。

build_info.properties文件:

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

build.xml文件:

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

如果select了编译或dist目标,此解决scheme会自动增加次要版本或修订版本号。 如果已经设置了以下属性之一,则可以closures增量:

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

如果属性inc.major已被设置,则主号码将被递增,而其他两个值将被设置为零。 正在通过版本文件的文本表示来计算SHA-1校验和。

顺便说一句:如果被允许,你可以在JDK 6中包含的java脚本中创build自己的ant任务。

现在这里是ant文件

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

构build过程

  1. build_info.properties将在构build项目文件夹期间创build您可以在此文件中编写关于构build的所有信息。
    • 像内部版本号,主要版本和次要版本号,时间戳和版本号。
  2. 你的构build脚本可以修改这些值,如何你想要的
  3. 构build成功后,将文件“build_info.properties”提交回存储库

在发展中

在第一次构build之后,文件build_info.properties将被放置在存储库中。 您可以随时更改和提交任何数字(主要,次要,内部版本号),或者在构build期间自动增加,如下面的示例中的build.number。

svnant例子

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

在我的项目中,我不会自动增加小号码和主号码。 我们从我们的全球构build属性中设置它。 像那样:

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

这是因为他们将被更改为版本(不适用于testing版或其他版本),并与其他来源(我们可以构build一些旧版本或分支版本)一起提交。

但是,如果你想增加次要号码,你可以像我的例子中的内部版本号一样。

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

最简单的方法就是改变问题。 而不是让任何构build为你做这个,有任何你调用的过程ant计算什么版本号应该是,然后作为一个属性传递,例如

ant -Dbuild.version = 1.2.3

无论你在做什么构build,都可以灵活使用,比如SVN修订版,当前date和时间等等。

ant -Dbuild.version = svnversion .

ant -Dbuild.version = date +"%Y%m%d%H%D"

ant -Dbuild.version = $ {major}。 svnversion .date +"%Y%m%d%H%D"

等你可以得到相当全面的,如果你想。

如果你想有一个不断增加的数字,那么你可以将它存储在一个文件中,然后在编译时传入。 例如,你可以这样做:

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

最后,如果你真的想把它放在build.xml文件中,最好的办法是有一个单独的任务来执行increment-and-build选项,并用你的“main”目标分离一个嵌套的ant build。 你会因此而结束

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

换句话说,假设你的build.xml中有一个(当前)默认的'build',那么把它改为'version'并让ant的版本任务进行计算,然后嵌套调用和构build。

实现作为练习留给读者,正如将方法转化为非UNIX平台一样。

这是一段时间以前,所以这是从记忆:

我构build了一个自定义CruiseControl.Net标签块,在每个构build上打上构build编号。 它维护了一个包含版本号所有4个组件的XML文件,并通过名称来标识每个项目(因此它可以支持多个项目)。

它生成的四个值传递给构build过程(在我们的例子中是nAnt),负责调整所有AssemblyInfo.cs文件以反映正确的构build号。

编辑注意:唯一值得自动打勾的是内部版本号。 主要/次要版本号在CC.Net项目configuration中被指定。 内部版本号重新开始于0001,对于主版本号或次版本号的每次更改(例如,如果您从7.1版本转到7.3版本,则7.1版本可能在版本号783,但是第一个7.3版本的版本号开始1;下一个7.1版本将build立784。

更改版本号只需要调整1设置CC.Netconfiguration文件。

我们可以用条件来检查是否应该增加微,小,大版本。

如果微为9,则增加次要,等等。

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