Номера сборки: Major.minor.revision - PullRequest
40 голосов
/ 16 сентября 2009

Как бы вы написали файл build.xml, не используя ни пользовательский код, ни внешние зависимости (такие как сценарий оболочки), что:

  • Создает номер сборки в форме major.minor.revision (например, 01.02.34 ).
  • Автоматически увеличивает ревизию при каждой компиляции исходного кода.
  • Автоматически увеличивает минорную версию при каждом выполнении задачи dist (ribution).

Дополнительно:

  • Предоставляет возможность увеличить главный номер.
  • Предоставляет возможность увеличить младший номер.
  • При каждом увеличении основного номера младший номер и номер редакции устанавливаются на 0.
  • При увеличении младшего номера номер редакции устанавливается равным 0.

Бонус:

  • Создает переменную на основе номера редакции git (например, номер редакции subversion).

Пояснение:

  • Автоматическая проверка (или фиксация) не требуется.
  • Интеграция с Subversion нежелательна.

Спасибо за любые примеры. Вот несколько связанных сайтов, которые описывают, как выполнять подобные задачи:

Ответы [ 7 ]

54 голосов
/ 21 сентября 2009

Файл 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>
4 голосов
/ 24 сентября 2009

Это решение автоматически увеличивает дополнительный номер или номер редакции, если выбрана цель компиляции или dist. Увеличение может быть отключено, если было установлено одно из следующих свойств:

  • -Dno.increment.minor = истина
  • -Dno.increment.revision = истина

Если свойство inc.major было установлено, то старший номер будет увеличиваться, а остальные оба значения будут установлены на ноль. Контрольная сумма SHA-1 рассчитывается по текстовому представлению файла версии.

Кстати: если бы это было разрешено, вы можете создать свою собственную задачу ant в java-скрипте, который включен в JDK 6.

Теперь вот файл муравья

<?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>
3 голосов
/ 16 сентября 2009

Процесс сборки

  1. build_info.properties будет создано при сборке в вашем проекте папка Вы можете написать всю информацию о вашей сборке в этом файле.
    • Как номер сборки, старшие и младшие номера выпуска, отметка времени и номер редакции.
  2. Ваш скрипт сборки может изменить эти значения, как только ваш хочет
  3. После успешного завершения сборки закомментируйте файл build_info.properties обратно в хранилище

Во время разработки

После первой сборки файл build_info.properties будет помещен в репозиторий. Вы можете изменить и зафиксировать любое число (старшее, младшее, номера сборки) сами, когда захотите, или увеличить его автоматически во время сборки, как build.number в примере ниже

svnant Пример

Использование 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>
2 голосов
/ 19 сентября 2009

Самый простой способ сделать это - изменить проблему. Вместо того чтобы делать сборку 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, лучше всего выполнить отдельную задачу для выполнения опции increment-and-build и разветвить вложенную сборку ant с помощью вашего 'main' цель. Таким образом, вы получите

ant -> ant -Dbuild.version = 1.2.3.4 -> ...

Другими словами, учитывая ваш build.xml с (текущим) значением по умолчанию 'build', затем измените его на 'version' и попросите, чтобы задача 'ant' version выполнила вычисление с последующим вложенным вызовом и build.

Реализация оставлена ​​читателю как упражнение, как и перевод подхода на не-UNIX платформу.

0 голосов
/ 26 февраля 2016

Мы можем использовать условия, чтобы проверить, следует ли нам увеличить микро, младшую и основную версию.

Увеличьте минор, если микро равен 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>
0 голосов
/ 21 января 2011

Это было некоторое время назад, так что это из памяти:

Я создаю пользовательский блок этикеток 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.

0 голосов
/ 17 сентября 2009

В моем проекте я не увеличиваю младший и старший номер автоматически. Мы устанавливаем это из наших глобальных свойств сборки. Вот так:

<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"/>
...