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

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

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

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

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

4b9b3361

Ответ 1

Это решение было разработано на 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.

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

Существует script, который я назвал 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а). В разделе "Местоположение" используйте "Обзор файловой системы" и перейдите и выберите файл script.

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

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

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

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

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

7b). Также отмечено "Во время автоматической сборки".

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

8). Хорошо настройте параметры сборки, а затем разместите свой конструктор между "Предварительной компиляцией Android" и "Java Builder".

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

Стив

Ответ 2

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

ok, здесь новый способ сделать это:

  • для вычисления version.code:

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

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

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

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

Реализация:

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

поэтому содержимое script равно:

<?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 или (хотя я очень сомневаюсь, что вы это потребуете) вы можете настроить его и поместить в какое-либо свойство (файл или встроенный, на ваш выбор).
  • Если сборка завершилась неудачей или прервана, версия останется такой, какая есть. (хотя я очень сомневаюсь, что это вызывает беспокойство, просто верните файл!)

Enjoy.

Refs

Важное редактирование

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

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

Ответ 3

Использование 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")
    ...
    }
}

Ответ 4

'  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)