web-dev-qa-db-fra.com

Numéros de build: major.minor.revision

Comment écririez-vous un build.xml, 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.minor.revision (par exemple, 01.02.34 ).
  • Incrémente automatiquement la révision à chaque compilation du code source.
  • Auto-incrémente la version mineure à chaque exécution d'une tâche de distribution (ribution).

Aditionellement:

  • Fournit une option pour incrémenter le nombre majeur.
  • Fournit une option pour incrémenter le nombre mineur.
  • Chaque fois que le nombre majeur est incrémenté, les numéros mineurs et de révision sont mis à 0.
  • Chaque fois que le nombre mineur est incrémenté, le numéro de révision est mis à 0.

Prime:

  • Crée une variable basée sur le numéro de révision git (comme un numéro de révision Subversion).

Clarification:

  • L'extraction automatique (ou validation) n'est pas requise.
  • L'intégration avec Subversion n'est pas souhaitée.

Merci pour tous les exemples. Voici quelques sites connexes qui décrivent comment effectuer des tâches similaires:

40
Dave Jarvis

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>
54
rodrigoap

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:

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

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>
4
dz.

Processus de construction

  1. 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.
    • Comme le numéro de version, les nombres majeurs et mineurs de version, l'horodatage et le numéro de révision.
  2. Votre script de construction peut modifier ces valeurs à votre guise
  3. Une fois la construction réussie, remettez le fichier 'build_info.properties' dans le référentiel

Pendant le développement

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.

exemple de svnant

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>
3
Scrutator

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.

2
AlBlue

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>
0
Vasile Surdu

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.

0
Nicholas Carey

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"/>
0
Scrutator