Comment écririez-vous un build.xml
, n'utilisant ni code personnalisé ni dépendances externes (comme un script Shell), qui:
Aditionellement:
Prime:
git
(comme un numéro de révision Subversion).Clarification:
Merci pour tous les exemples. Voici quelques sites connexes qui décrivent comment effectuer des tâches similaires:
Le build_info.properties
fichier:
build.major.number=00
build.revision.number=00
build.minor.number=00
Le build.xml
fichier:
<?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>
Cette solution incrémente automatiquement le numéro de version mineure ou de révision si une compilation ou une cible dist a été sélectionnée. L'incrémentation peut être désactivée si l'une des propriétés suivantes a été définie:
Si la propriété inc.major a été définie, le nombre majeur sera incrémenté et les deux autres valeurs seront mises à zéro. La somme de contrôle SHA-1 est calculée par la représentation textuelle du fichier de version.
Au fait: si cela avait été autorisé, vous pouvez créer votre propre tâche fourmi dans Java script, qui est inclus dans JDK 6.
Maintenant, voici le fichier des fourmis
<?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
sera créé lors de la construction dans le dossier de votre projet Vous pouvez écrire toutes les informations sur votre construction dans ce fichier. Après la première construction, le fichier build_info.properties sera placé dans le référentiel. Vous pouvez modifier et valider n'importe quel nombre (majeur, mineur, numéros de build) par vous-même quand vous le souhaitez, ou l'augmenter automatiquement pendant la construction comme build.number dans l'exemple ci-dessous.
Utilisation de 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>
La manière la plus simple d'y parvenir est de changer le problème. Au lieu de faire en sorte que la construction Any fasse cela pour vous, demandez au processus que vous appelez Ant de calculer le numéro de version, puis passez-le en tant que propriété, par exemple.
ant -Dbuild.version = 1.2.3
Cela a la flexibilité de n'importe quelle version avec laquelle vous travaillez, pouvant s'inspirer de n'importe quoi, comme la révision SVN, la date et l'heure actuelles, ou autre.
ant -Dbuild.version = svnversion .
ant -Dbuild.version = date +"%Y%m%d%H%D"
ant -Dbuild.version = $ {major} .svnversion .
.date +"%Y%m%d%H%D"
etc. Vous pouvez être assez complet si vous le souhaitez.
Si vous souhaitez avoir un nombre toujours croissant, vous pouvez le stocker dans un fichier, puis le transmettre au moment de la compilation. Par exemple, vous pouvez faire:
VER = cat build.version
VER = $ ((VER + 1)) echo $ VER> build.version
Enfin, si vous voulez vraiment que cela se trouve dans le fichier build.xml, la meilleure chose à faire est d'avoir une tâche distincte pour exécuter l'option incrémenter et construire et créer une fourmi imbriquée avec votre cible `` principale ''. Tu finirais donc avec
ant -> ant -Dbuild.version = 1.2.3.4 -> ...
En d'autres termes, étant donné votre build.xml avec la valeur par défaut (actuelle) de 'build', changez-le en 'version' et demandez à la tâche de version ant 'de faire le calcul suivi d'un appel imbriqué à et build.
La mise en œuvre est laissée au lecteur comme un exercice, tout comme la traduction de l'approche vers une plate-forme non UNIX.
Nous pouvons utiliser des conditions pour vérifier si nous devons augmenter la version micro, mineure et majeure.
Augmentez le niveau mineur si le micro est égal à 9, et ainsi de suite.
<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>
C'était il y a quelque temps, donc c'est de mémoire:
Je construis un bloc d'étiqueteur CruiseControl.Net personnalisé qui a coché le numéro de build sur chaque build. Il a maintenu un fichier XML avec les 4 composants du numéro de version et identifié chaque projet par son nom (afin qu'il puisse prendre en charge plusieurs projets).
Les quatre valeurs qu'il a générées sont passées au processus de construction (nAnt, dans notre cas), qui avait la responsabilité de peaufiner tous les fichiers AssemblyInfo.cs pour refléter le numéro de construction approprié.
Modifié pour noter: la seule valeur qui est automatiquement cochée était le numéro de build. Les numéros de version majeure/mineure ont été spécifiés dans la configuration du projet CC.Net. Le numéro de version a redémarré à 0001 pour chaque changement de numéro de révision majeur ou mineur (par exemple, si vous êtes passé de la version 7.1 à la version 7.3, par exemple, la version 7.1 pourrait être au numéro de version 783, mais la première version 7.3 a commencé avec le numéro de version 1; la prochaine version 7.1 serait la construction 784.
Le changement des numéros de version a simplement nécessité le réglage 1 du fichier de configuration CC.Net.
Dans mon projet, je n’augmente pas automatiquement le nombre mineur et majeur. Nous le définissons à partir de nos propriétés de construction globales. Comme ça:
<entry key="build.major.number" value="${global.release.major}"></entry>
<entry key="build.minor.number" value="${global.release.minor}"></entry>
En effet, ils seront modifiés pour les versions (pas pour les versions de test ou autres) et validés avec d’autres sources (nous avons pu créer une version ancienne ou une branche).
Mais si vous souhaitez augmenter le nombre mineur, vous pouvez le faire comme le numéro de build dans mon exemple.
<entry key="build.major.number" type="int" operation="+" default="1" pattern="00"/>