如何使用自定义代码和外部依赖项(例如shell脚本)编写build.xml
文件:
此外:
加成:
git
修订号(如颠覆修订号)创建变量。澄清:
感谢您提供任何示例。以下是一些描述如何执行类似任务的相关网站:
答案 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目标,此解决方案会自动增加次要编号或修订版号。如果已设置以下属性之一,则可以关闭增量:
如果已设置属性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)
build_info.properties
将在项目构建期间创建
文件夹您可以在此文件中编写有关构建的所有信息。
首次构建文件后,build_info.properties将被放置在存储库中。 您可以随时更改和提交任何数字(主要,次要,内部版本号),或者在构建过程中自动增加它,如下例中的build.number。
使用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>