Автоматическая нумерация версий вашего Android-приложения с помощью Git и Eclipse
Я считаю, что компьютеры-это лучшие вещи для выполнения повторяющихся задач. Я, конечно, нет, я либо забываю, либо (в основном) не делаю вещи последовательным образом - что не то, что я хочу.
одна из вещей, которые я, вероятно, сделаю, это забыть информацию о версии в манифесте, когда я публикую новую версию приложения для Android. В прошлом я работал с настроенными системами сборки, которые имеют функцию автоматической нумерации версий, и я привык к ней (или, может быть, я получил ленивый.)
Я нашел это сообщение Stackoverflow очень полезно в разработке решения, но мне потребовалось некоторое время, чтобы настроить его так, чтобы он работал именно так, как я хочу. Более ранние попытки когда-нибудь вызовут продолжение строительства, что было болью. Поэтому я решил опубликовать свое решение здесь в надежде, что кто-то еще найдет его полезным.
4 ответов
это решение было разработано на Linux. Я уверен, что опытные разработчики Windows & Mac могут адаптировать его к своим платформам, но я не такой разработчик. Linux-это то, где живет мой набор навыков.
Git имеет хорошую функцию в в файле манифеста.
на 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). Назовите свою версию чем-то вроде "
4). Настройте вкладку "Main" следующим образом:
4a). В разделе " расположение "используйте" обзор файловой системы " и перейдите и выберите файл сценария.
4b). В разделе "рабочий каталог" используйте "обзор рабочего пространства", чтобы выбрать проект.
5). Оставьте" обновить ресурсы по завершении "непроверенным на вкладке "обновить".
6). Не устанавливайте переменные на вкладке "среда".
7). На вкладке "Параметры сборки":
7a). Убедитесь, что" во время ручной сборки " отмечен галочкой и
7b). Это "во время автоматической сборки" также отмечено.
7c). Теперь у меня есть все остальное. Я даже не выделяю ему консоль. Орел возможно, я заметил, что сценарий действительно выдает некоторую информацию, но теперь, когда он работает, я просто хочу, чтобы он работал тихо, не беспокоя меня.
8). Хорошо настройки сборки, а затем поместите свой конструктор между "Android Pre-Compile"и" Java Builder".
вернитесь к разработке приложений в безопасности, зная, что они правильно версируются, и проверьте информацию о своем приложении. Разве это не классный номер версии? :-)
Стив
идея (используя исполняемый файл ant и git)
ок, вот новый способ сделать это:
-
расчета
version.code
:git rev-list master --first-parent --count
такое руководство по управлению версиями. Поскольку он эффективно находит количество коммитов от начального commit (включительно) который всегда увеличивается от предыдущей версии.
-
для вычисление
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
с текущим кодом версии и именем, хранящимся в мерзавец.
предостережения
- начальный код версии и имя устанавливаются в 0 по завершении сборки. Если вам это нужно, замените ноль в
-post-build
target, или (хотя я очень сомневаюсь, что вам это потребуется) вы можете сделать его настраиваемым и поместить его в какое-либо свойство (файл или встроенный; ваш выбор) - если сборка не выполнена или прервана, версия останется как есть. (хотя я очень сомневаюсь, что это имеет какое-либо отношение, просто верните файл!)
наслаждайтесь.
Refs
- лучший способ интегрировать Git с Ant?
- macrodef для Git самодельные из задачи Ant для Git | tlrobinson.net блог
Важно Изменить
- С
HEAD
для вычисления номера сборки; вызывает проблему понижения версии при выполнении сборки во время разработки и позже при установке стабильной версия (или при переходе от бета-версии к основному выпуску). с помощьюmaster
(или ветвь, которая используется для производственных сборок) ref вместо этого.
PS: актуально для пользователей:автоматическое управление версиями 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)