build.xml
ファイル。カスタムコードも外部依存関係(シェルスクリプトなど)も使用せず、次のことを行います。
さらに:
ボーナス:
git
リビジョン番号(Subversionリビジョン番号など)に基づいて変数を作成します。明確化:
例をありがとう。同様のタスクを実行する方法を説明するいくつかの関連サイトは次のとおりです。
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>
このソリューションは、コンパイルまたはdistターゲットが選択されている場合、マイナー番号またはリビジョン番号を自動的に増分します。次のプロパティのいずれかが設定されている場合、増分をオフにできます。
プロパティinc.majorが設定されている場合、メジャー番号がインクリメントされ、他の両方の値はゼロに設定されます。 SHA-1チェックサムは、バージョンファイルのテキスト表現によって計算されています。
ちなみに、許可されていれば、JDK 6に含まれているJavaスクリプトで独自の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_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>
これを行う最も簡単な方法は、問題を変更することです。 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> build.version
最後に、本当にこれをbuild.xmlファイルに含めたい場合は、インクリメントアンドビルドオプションを実行し、ネストされたantビルドを「メイン」ターゲットでフォークする別のタスクを実行するのが最善の方法です。あなたはこうして終わるでしょう
ant-> ant -Dbuild.version = 1.2.3.4-> ...
つまり、(現在の)デフォルトが「build」であるbuild.xmlを指定して、それを「version」に変更し、ant「versionタスク」に計算を実行させてから、ネストされた呼び出しとビルドを実行します。
UNIX以外のプラットフォームへのアプローチの変換と同様に、実装は読者への課題として残されています。
条件を使用して、マイクロ、マイナー、メジャーバージョンを増やす必要があるかどうかを確認できます。
マイクロが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>
これは少し前のことなので、これはメモリからのものです:
各ビルドでビルド番号を刻むカスタムCruiseControl.Netラベラーブロックをビルドします。バージョン番号の4つのコンポーネントすべてを含むXMLファイルを維持し、各プロジェクトを名前で識別しました(そのため、複数のプロジェクトをサポートできます)。
生成された4つの値は、適切なビルド番号を反映するようにすべてのAssemblyInfo.csファイルを微調整する責任があったビルドプロセス(この場合はnAnt)に渡されます。
注意して編集:自動的にチェックされる唯一の値はビルド番号です。メジャー/マイナーバージョン番号は、CC.Netプロジェクト構成で指定されています。メジャーリビジョン番号またはマイナーリビジョン番号が変更されるたびにビルド番号が0001から再開されます(たとえば、バージョン7.1からバージョン7.3に変更した場合、7.1ビルドはビルド番号783になる可能性がありますが、最初の7.3ビルドはビルド番号で開始されます1;次の7.1ビルドはビルド784になります。
バージョン番号を変更するには、CC.Net構成ファイルの設定を1つ調整するだけで済みます。
私のプロジェクトでは、マイナー番号とメジャー番号を自動的に増やしません。グローバルビルドプロパティから設定します。そのように:
<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"/>