Строить числа: major.minor.revision
Как вы напишете файл build.xml
, не используя ни пользовательский код, ни внешние зависимости (например, оболочку script), которые:
- Создает номер сборки формы major.minor.revision(например, 01.02.34).
- Автоматическое добавление изменений в каждую компиляцию исходного кода.
- Автоматически увеличивает малую версию при каждом выполнении задачи dist (ribution).
Дополнительно:
- Предоставляет возможность увеличить основной номер.
- Предоставляет возможность увеличения младшего номера.
- Всякий раз, когда основное число увеличивается, младшие и ревизионные номера устанавливаются на 0.
- Всякий раз, когда младший номер увеличивается, номер версии устанавливается в 0.
Bonus:
- Создает переменную на основе номера версии
git
(например, номер версии подрывной версии).
Разъяснение:
- Автоматическая проверка (или фиксация) не требуется.
- Интеграция с Subversion не нужна.
Спасибо за любые примеры. Вот некоторые связанные сайты, которые описывают, как выполнять аналогичные задачи:
Ответы
Ответ 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>