Автоматическая версия с номером вашей Android-приложения с использованием Git и Eclipse

Я считаю, что компьютеры – это лучшие вещи для выполнения повторяющихся задач. Я, конечно, нет, я либо забываю, либо (в основном) не делаю ничего последовательным образом – чего я не хочу.

Одна из вещей, которые я, скорее всего, сделаю, – это забыть обновить информацию о версии в манифесте, когда я публикую новую версию приложения для Android. Раньше я работал с настроенными системами сборки, у которых есть функция автоматической версии, и я использовал ее (или, может быть, я ленился).

Я нашел эту статью Stackoverflow очень полезной при разработке решения, но мне потребовалось некоторое время, чтобы настроить ее так, чтобы она работала именно так, как я ее хочу. Раньше попытки когда-нибудь вызывали продолжение строительства, что было больно. Поэтому я решил опубликовать свое решение здесь в надежде, что кто-то найдет его полезным.

Solutions Collecting From Web of "Автоматическая версия с номером вашей Android-приложения с использованием Git и Eclipse"

Это решение было разработано на Linux. Я уверен, что опытные разработчики Windows и Mac могут адаптировать их к своим платформам, но я не такой разработчик. Linux – это то место, где живет мой набор навыков.

Git имеет приятную функцию в git describe --dirty . Он сканирует журнал фиксации и находит тег, а затем строит строку версии. Если это «производственная сборка», где последняя фиксация была отмечена, и все файлы были отмечены, то это ваша строка версии. Если это сборка разработки, то последний тег добавляется с количеством дополнительных коммитов и сокращенным хеш-кодом. Флаг --dirty – это просто вишня на глазури на торте: она добавляет слово dirty если есть какие-либо измененные файлы, которые еще не были зафиксированы. Это идеально подходит для вашего android:versionName в файле манифеста.

Для android:versionCode требуется номер. Это нужно для часов для релизов, но не для сборки разработки, и поскольку каждая версия будет иметь тег с версией, я просто считаю это. Я всегда отмечаю свои версии в форме v<major>.<minor>[.<patch>] где <major> , <minor> и <patch> являются просто цифрами. Поэтому подсчитываются теги, которые начинаются с нижнего регистра «v», за которым следует цифра, все это действительно необходимо.

После завершения с файлом манифеста шаблона я обнаружил, что лучшим способом было просто использовать файл AndroidManifest.xml в базе проекта, отредактированный с помощью редактора потока sed и внесение результата в bin / AndroidManifest.xml.

Поэтому я разработал сценарий ниже, поместил его в папку сценариев на том же уровне, что и мои проекты (чтобы все они могли использовать один и тот же сценарий), а затем настроил собственный конструктор в Eclipse.

Существует сценарий, который я назвал version.sh :

 #/bin/bash echo "Auto Version: `pwd`" CODE=`git tag | grep -c ^v[0-9]` NAME=`git describe --dirty | sed -e 's/^v//'` COMMITS=`echo ${NAME} | sed -e 's/[0-9\.]*//'` if [ "x${COMMITS}x" = "xx" ] ; then VERSION="${NAME}" else BRANCH=" (`git branch | grep "^\*" | sed -e 's/^..//'`)" VERSION="${NAME}${BRANCH}" fi echo " Code: ${CODE}" echo " Ver: ${VERSION}" cat AndroidManifest.xml | \ sed -e "s/android:versionCode=\"[0-9][0-9]*\"/android:versionCode=\"${CODE}\"/" \ -e "s/android:versionName=\".*\"/android:versionName=\"${VERSION}\"/" \ > bin/AndroidManifest.xml exit 0 

Чтобы настроить конструктор, выполните следующие действия:

1). Щелкните правой кнопкой мыши базу проекта и выберите «Свойства», а затем «Строители».

2). Нажмите кнопку «Создать» и выберите «Программа».

3). Назовите свою версию что-то вроде «<project> Auto Version». Эта строка должна быть уникальной для всех проектов.

4). Настройте вкладку «Главная» следующим образом:

4а). В разделе «Местоположение» используйте «Обзор файловой системы» и перейдите и выберите файл сценария.

4b). В разделе «Рабочий каталог» используйте «Обзор рабочей области», чтобы выбрать проект.

5). Оставьте флажок «Обновить ресурсы после завершения», не отмеченные на вкладке «Обновить».

6). Не устанавливайте никаких переменных на вкладке «Окружающая среда».

7). На вкладке «Параметры сборки»:

7а). Убедитесь, что «Во время ручной сборки» отмечен галочкой, и

7б). Это также означает, что «Во время автоматической сборки» также отмечен галочкой.

7c). Теперь у меня осталось все остальное. Я даже не выделяю ему консоль. Орел, смотревший на него, возможно, заметил, что сценарий выводит некоторую информацию, но теперь у меня это работает, я просто хочу, чтобы все работало тихо, не беспокоя меня.

8). Хорошо настройте параметры сборки, а затем разместите свой застройщик между «Android Pre-Compile» и «Java Builder».

Вернитесь к созданию безопасных приложений, зная, что они правильно версируются, и ознакомьтесь с информацией о вашем приложении. Разве это не номер версии. 🙂

Стив

Идея (с использованием ant и git-исполняемого файла)

Хорошо, вот новый способ сделать это:

  • Для расчета version.code :

    git rev-list master --first-parent --count

    Это следует за руководством по версии . Поскольку он эффективно находит количество коммитов от первоначальной фиксации (включительно), которая всегда увеличивается с предыдущей версии.

  • Для вычисления version.name :

    git describe --tags --dirty --abbrev=7

Реализация:

build.xml обычно импортирует пользовательский скрипт ant под названием custom_rules.xml

Поэтому содержимое скрипта будет выглядеть так:

 <?xml version="1.0" encoding="UTF-8"?> <project name="application-custom"> <macrodef name="git" taskname="@{taskname}"> <attribute name="command" /> <attribute name="dir" default="" /> <attribute name="property" default="" /> <attribute name="taskname" default="" /> <attribute name="failonerror" default="on" /> <element name="args" optional="true" /> <sequential> <exec executable="git" dir="@{dir}" outputproperty="@{property}" failifexecutionfails="@{failonerror}" failonerror="@{failonerror}"> <arg value="@{command}" /> <args/> </exec> </sequential> </macrodef> <target name="-pre-build"> <git command="rev-list" property="versioning.code" taskname="versioning"> <args> <arg value="master" /> <arg value="--first-parent" /> <arg value="--count" /> </args> </git> <git command="describe" property="versioning.name" taskname="versioning"> <args> <arg value="--tags" /> <arg value="--dirty" /> <arg value="--abbrev=7" /> </args> </git> <echo level="info" taskname="versioning">${versioning.code}, ${versioning.name}</echo> <replaceregexp file="AndroidManifest.xml" match='android:versionCode=".*"' replace='android:versionCode="${versioning.code}"' /> <replaceregexp file="AndroidManifest.xml" match='android:versionName=".*"' replace='android:versionName="${versioning.name}"' /> </target> <target name="-post-build" > <replaceregexp file="AndroidManifest.xml" match='android:versionCode=".*"' replace='android:versionCode="0"' /> <replaceregexp file="AndroidManifest.xml" match='android:versionName=".*"' replace='android:versionName="0"' /> </target> 

Просто сделал бы.

В оболочке ореха он просто заменяет android.versionCode и android.versionName текущим кодом и именем текущей версии, хранящейся в git.

Предостережения

  • Код начальной версии и имя устанавливается в 0 после завершения сборки. Если вам это нужно, замените ноль на цель -post-build или (хотя я очень сомневаюсь, что вы это потребуете) вы можете настроить его и поместить в какое-либо свойство (файл или встроенный, на ваш выбор)
  • Если сборка не удалась или прервана, версия останется такой, какая есть. (Хотя я очень сомневаюсь, что это вызывает беспокойство, просто верните файл!)

Наслаждаться.

Refs

  • Лучший способ интегрировать Git с Ant?
  • Macrodef для git импровизирует из Ant Tasks для Git | Блог пользователя tlrobinson.net

Важное изменение

  1. Предотвратить использование HEAD для вычисления номера сборки; Вызывает проблему с понижением версии при выполнении сборки во время разработки, а затем при установке стабильной версии (или при выполнении бета-версии на основной выпуск). Вместо этого используется master (или ветвь, которая используется для производственных сборок).

PS: актуально для пользователей AS: Автоматическое исполнение Android-проекта с git с помощью Android Studio / Gradle

Использование Android Studio (Gradle): просмотрите это сообщение в блоге: http://blog.android-develop.com/2014/09/automatic-versioning-and-increment.html

Вот реализация из блога:

  android { defaultConfig { ... // Fetch the version according to git latest tag and "how far are we from last tag" def longVersionName = "git -C ${rootDir} describe --tags --long".execute().text.trim() def (fullVersionTag, versionBuild, gitSha) = longVersionName.tokenize('-') def(versionMajor, versionMinor, versionPatch) = fullVersionTag.tokenize('.') // Set the version name versionName "$versionMajor.$versionMinor.$versionPatch($versionBuild)" // Turn the version name into a version code versionCode versionMajor.toInteger() * 100000 + versionMinor.toInteger() * 10000 + versionPatch.toInteger() * 1000 + versionBuild.toInteger() // Friendly print the version output to the Gradle console printf("\n--------" + "VERSION DATA--------" + "\n" + "- CODE: " + versionCode + "\n" + "- NAME: " + versionName + "\n----------------------------\n") ... } } 
 ' for windows ' preBuildMy.cmd include repVer.vbs ' repVer.vbs : Dim objFileSystem, objOutputFile Dim objInputFile Dim sText,gitFile FileName = "./bin/AndroidManifest.xml" ' gitFile = ".\..\.git\refs\heads\master" gitFile = ".\..\.git\refs\remotes\origin\master" Set objFileSystem = CreateObject("Scripting.fileSystemObject") set objInputFile= objFileSystem.OpenTextFile(FileName) sText= objInputFile.ReadAll set objOutputFile = objFileSystem.CreateTextFile(FileName , TRUE) set objInputFile= objFileSystem.OpenTextFile(gitFile) refText= objInputFile.ReadAll sText = Replace(sText,"v1.0","v 1.0 " & Now & " ref=" & mid(refText,1,7)) objOutputFile.WriteLine(sText) objOutputFile.Close Set objFileSystem = Nothing WScript.Quit(0)