Construire des nombres: majeur.mineur.révision
comment écririez-vous un build.xml
fichier, n'utilisant NI code personnalisé ni dépendances externes( comme un script shell), qui:
- génère un numéro de build de la forme major.mineur.révision (par exemple, 01.02.34).
- incréments automatiques la révision de chaque compilation du code source.
- incréments automatiques la version mineure à chaque exécution d'une tâche de distribution.
en Outre:
- fournit un option pour incrémenter le nombre majeur.
- Fournit une option pour incrémenter le numéro mineur.
- chaque fois que le nombre majeur est incrémenté, les nombres mineur et de révision sont définis à 0.
- chaque fois que le nombre mineur est incrémenté, le numéro de révision est mis à 0.
Bonus:
- crée une variable basée sur le
git
numéro de révision (comme une révision subversion) nombre.)
Précision:
- la vérification automatique (ou la propagation) n'est pas requise.
- L'intégration avec Subversion n'est pas souhaitée.
Merci pour les exemples. Voici quelques sites connexes qui décrivent comment effectuer des tâches similaires:
- Créer un Numéro De Build avec Ant.
- BuildNumber tâche Ant.
- Ant et construction Version Nombres.
7 réponses
build_info.properties
fichier:
build.major.number=00
build.revision.number=00
build.minor.number=00
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 un nombre mineur ou de révision si une cible de compilation ou de dist a été sélectionnée. L'incrémentation peut être désactivé si l'une des propriétés suivantes ont été définies:
- - Dno.incrément.mineur=true
- - Dno.incrément.revision=true
Si la propriété inc.major a été réglé, puis le nombre majeur sera incrémenté et les deux autres valeurs seront réglées à zéro. Le checksum SHA-1 est calculé par la représentation textuelle du fichier de version.
soit dit en passant: si vous aviez été autorisé, vous pourriez créer votre propre tâche ant en script java, qui est inclus dans JDK 6.
maintenant voici le fichier 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>
Processus De Construction
build_info.properties
sera créé lors de la construction de votre projet dossier vous pouvez écrire toutes les informations sur votre construction dans ce fichier.- comme le nombre de build, les nombres majeurs et mineurs de release, timestamp, et le numéro de révision.
- votre script de construction peut modifier ces valeurs, quelle que soit votre voulez
- après que la compilation a été réussie, propagez le fichier ' build_info.propriétés de " retour à l' le référentiel
Pendant Le Développement
après avoir construit le fichier build_info.les propriétés seront placées dans le dépôt. Vous pouvez changer et engager n'importe quel nombre (majeur, mineur, construire des nombres) par vous-même quand jamais vous voulez, ou l'augmenter automatiquement pendant construire comme construire.nombre dans l'exemple ci-dessous.
svnant Exemple
à l'Aide 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 façon la plus facile de faire cela est de changer le problème. Au lieu de faire en sorte que N'importe quelle construction fasse cela pour vous, demandez à n'importe quel processus que vous appelez Ant de calculer ce que devrait être le numéro de version, et puis passez cela en tant que propriété par exemple
ant-Dbuild.version = 1.2.3
ceci a la flexibilité de n'importe quelle construction avec laquelle vous travaillez, être capable de s'inspirer de n'importe quoi, comme la révision SVN, la date et l'heure actuelles, ou n'importe quoi d'autre.
ant - Dbuild.version=svnversion .
ant-Dbuild.version=date +"%Y%m%d%H%D"
ant-Dbuild.version=${majeur}.svnversion .
.date +"%Y%m%d%H%D"
etc. Vous pouvez être assez complet si vous voulez.
si vous voulez avoir un nombre croissant, alors vous pouvez le stocker dans un fichier et 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 ce soit dans le construire.xml file, la meilleure chose à faire est d'avoir une tâche séparée pour exécuter l'option increment-and-build et dévier une construction Ant imbriquée avec votre cible "principale". Vous feriez donc se retrouver avec
ant - > ant-Dbuild.version = 1.2.3.4 -> ...
En d'autres termes, compte tenu de votre construction.xml avec un défaut (courant) de' build', puis le changer en' version 'et demander à la tâche de version ant' de faire le calcul suivi d'un appel imbriqué et de construire.
la mise en oeuvre est laissée comme une exercice pour le lecteur, comme c'est la traduction de l'approche à un non-plate-forme UNIX.
dans mon projet, je n'augmente pas automatiquement le nombre mineur et majeur. Nous l'avons établi à partir de nos propriétés de construction globale. Comme ça:
<entry key="build.major.number" value="${global.release.major}"></entry>
<entry key="build.minor.number" value="${global.release.minor}"></entry>
c'est parce qu'ils seront modifiés pour les versions (pas pour les compilations de test ou autres) et engagés avec d'autres sources (nous avons pu construire une version ancienne ou branche).
Mais si vous voulez 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"/>
C'était il y a longtemps, donc c'est de mémoire:
je construis un custom CruiseControl.Net le bloc labeller qui a coché le numéro de build sur chaque build. Il tenait à jour un fichier XML contenant les quatre composantes du numéro de version et identifiait chaque projet par son nom (afin de pouvoir prendre en charge plusieurs projets).
Les quatre valeurs générées passées au processus de construction (nAnt, dans notre cas), qui avait la responsabilité de peaufiner tous les AssemblyInfo.fichiers cs pour refléter le bon numéro de construction.
modifié pour noter: la seule valeur qui est activée automatiquement est le numéro de build. Les numéros de version Major/Minor ont été spécifiés dans le CC.Net configuration du projet. Le numéro de build 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 à la version 783, mais la première version 7.3 a commencé avec la version 1; la prochaine version 7.1 serait la construction 784.
Modifier les numéros de version il suffit de modifier 1 CC.Net fichier de configuration.
nous pouvons utiliser les conditions pour vérifier si nous devrions augmenter la version micro,mineure et majeure.
augmentation mineure si micro est 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>