内部编号:major.minor.revision

时间:2009-09-16 06:37:07

标签: java ant build-process versioning

如何使用自定义代码和外部依赖项(例如shell脚本)编写build.xml文件:

  • 生成major.minor.revision形式的内部版本号(例如 01.02.34 )。
  • 每次编译源代码时自动递增修订版。
  • 每次执行dist(ribution)任务时自动递增次要版本。

此外:

  • 提供增加主号码的选项。
  • 提供增加次要号码的选项。
  • 每当主要编号递增时,次要编号和修订编号都设置为0.
  • 每当次要编号递增时,修订号将设置为0.

加成:

  • 根据git修订号(如颠覆修订号)创建变量。

澄清:

  • 不需要自动结帐(或提交)。
  • 不希望与Subversion集成。

感谢您提供任何示例。以下是一些描述如何执行类似任务的相关网站:

7 个答案:

答案 0 :(得分:54)

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>

答案 1 :(得分:4)

如果选择了编译或dist目标,此解决方案会自动增加次要编号或修订版号。如果已设置以下属性之一,则可以关闭增量:

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

如果已设置属性inc.major,则主要数字将递增,另外两个值将设置为零。 SHA-1校验和由版本文件的文本表示计算。

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

现在这是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>

答案 2 :(得分:3)

构建过程

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

    首次构建文件后,build_info.properties将被放置在存储库中。 您可以随时更改和提交任何数字(主要,次要,内部版本号),或者在构建过程中自动增加它,如下例中的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>
    

答案 3 :(得分:1)

最简单的方法是更改​​问题。不要让Any版本为你做这个,让你正在调用的任何进程Ant计算版本号应该是什么,然后将其作为属性传递,例如。

ant -Dbuild.version = 1.2.3

这具有您正在使用的任何构建的灵活性,能够从任何方面获取其提示,例如SVN修订版,当前日期和时间等等。

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&gt; build.version

最后,如果你真的希望它在build.xml文件中,那么最好的办法就是有一个单独的任务来执行increment-and-build选项并用你的'main'分叉一个嵌套的ant build目标。你最终得到了

ant - &gt; ant -Dbuild.version = 1.2.3.4 - &gt; ......

换句话说,给定build.xml的(当前)默认为'build',然后将其更改为'version'并让ant'版本任务执行计算,然后嵌套调用并生成。< / p>

将实现留给读者,将方法转换为非UNIX平台。

答案 4 :(得分:0)

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

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

那是因为它们将针对发行版进行更改(不适用于测试或其他版本)并与其他源一起提交(我们可以构建一些旧版本或分支版本)。

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

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

答案 5 :(得分:0)

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

我构建了一个自定义的CruiseControl.Net贴标机块,用于勾选每个构建版本的内部版本号。它维护了一个XML文件,其中包含版本号的所有4个组件,并按名称标识每个项目(因此它可以支持多个项目)。

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

编辑注意:自动勾选的唯一值是内部版本号。 CC.Net项目配置中指定了主要/次要版本号。对于主要或次要修订版号的每次更改,内部版本号重新启动为0001(例如,如果从版本7.1转到版本7.3,则7.1版本可能位于版本号783,但是第一个7.3版本以内部版本号开始1;下一个7.1版本将构建784。

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

答案 6 :(得分:0)

我们可以使用条件来检查是否应该增加微型,次级和主要版本。

如果微观是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>