Подтвердить что ты не робот

Строить числа: major.minor.revision

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

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

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

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

Bonus:

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

Разъяснение:

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

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

4b9b3361

Ответ 1

Файл 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>

Ответ 2

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

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

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

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

Теперь здесь 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>

Ответ 3

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

  • build_info.properties будет создан во время сборки вашего проекта folder Вы можете написать всю информацию о своей сборке в этом файле.
    • Как и номер сборки, основные и младшие номера выпуска, отметки времени и номера версии.
  • Ваша сборка script может измените эти значения как всегда хотите
  • После того, как сборка была успешной, скопируйте файл 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>

Ответ 4

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

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

Ответ 5

Самый простой способ сделать это - изменить проблему. Вместо того, чтобы сделать сборку 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 с вашим " Главная цель. Таким образом, вы получите

ant → Ant -Dbuild.version = 1.2.3.4 → ...

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

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

Ответ 6

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

Я создаю специальный блок Label 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.

Ответ 7

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

Увеличьте минор, если микро - 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>