14

反復作業を行うにはコンピュータが最適だと思います。私は確かにそうではありません。忘れているか、(ほとんどの場合)一貫した方法で物事を行っていません。これは私が望んでいることではありません。

私がやりがちなことの 1 つは、Android アプリの新しいバージョンを公開するときに、マニフェストにバージョン情報を追加するのを忘れることです。過去に、自動バージョン番号付け機能を備えた構成済みのビルド システムで作業したことがあり、それに慣れました (または怠け者になったのかもしれません)。

このStackoverflow の投稿は解決策を考え出すのに非常に役立つことがわかりましたが、微調整するのに時間がかかり、思いどおりに機能するようになりました。以前の試みでは、構築が続行される場合があり、これは苦痛でした。そのため、他の誰かが役立つことを期待して、ここで自分のソリューションを公開すると思いました。

4

4 に答える 4

15

このソリューションは Linux で開発されました。熟練した Windows と Mac の開発者であれば、プラットフォームに適応させることができると確信していますが、私はそのような開発者ではありません。Linux は私のスキルセットが生きる場所です。

Git には、git describe --dirtyコマンドに優れた機能があります。コミット ログをスキャンしてタグを見つけ、そこからバージョン文字列を作成します。これが最後のコミットがタグ付けされ、すべてのファイルがチェックインされた「本番ビルド」である場合、それがバージョン文字列です。これが開発ビルドの場合、最後のタグに追加のコミット数と省略されたハッシュ コードが追加されます。--dirtyフラグはケーキの飾りにすぎdirtyません。まだコミットされていない変更済みファイルがある場合、フラグはその単語を追加します。android:versionNameこれは、マニフェスト ファイルの属性に最適です。

android:versionCode番号が必要です。これはリリース用にクロックする必要がありますが、開発ビルド用ではありません。すべてのリリースはバージョン文字列のタグがあるため、単純にカウントします。私は常に自分のバージョンに 、、およびが単なる数字の形式v<major>.<minor>[.<patch>]でタグを付けます。したがって、ここで本当に必要なのは、小文字の「v」で始まり、その後に数字が続くタグをカウントすることだけです。<major><minor><patch>

テンプレート マニフェスト ファイルを追跡した後、最善の方法は、プロジェクト ベースの 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)。「メイン」タブを次のように構成します。

4a)。[場所] セクションで [ファイル システムの参照] を使用し、スクリプト ファイルに移動して選択します。

4b)。「作業ディレクトリ」セクションで、「ワークスペースの参照」を使用してプロジェクトを選択します。

5)。[更新] タブで [完了時にリソースを更新] をオフのままにします。

6)。「環境」タブで変数を設定しないでください。

7)。[ビルド オプション] タブで次の操作を行います。

7a)。「手動ビルド中」にチェックが入っていることを確認し、

7b)。その「自動ビルド中」もチェックされています。

7c)。私は今、他のすべてを未選択のままにしています。コンソールも割り当てません。そこに目を向けたワシは、スクリプトが何らかの情報を出力していることに気付いたかもしれませんが、今は問題なく機能しているので、気にせずに静かに実行したいだけです.

8)。ビルド設定に問題がなければ、ビルダーを「Android Pre-Compile」と「Java Builder」の間に配置します。

アプリが適切にバージョン管理されていることを認識して安全なアプリの開発に戻り、アプリの情報を確認してください。そのバージョン番号はクールではありませんか。:-)

スティーブ

于 2013-02-15T12:51:46.707 に答える
12

アイデア(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簡単に言うと、 andandroid.versionNameを git に保存されている現在のバージョン コードと名前に置き換えるだけです。

注意事項

  • 初期のバージョン コードと名前は、ビルドの完了時に 0 に設定されます。必要な場合は、-post-buildターゲットのゼロを置き換えるか、または(必要になるとは思えませんが)構成可能にして、いくつかのプロパティ(ファイルまたは埋め込み;選択)に配置できます
  • ビルドが失敗または中止された場合、バージョンはそのまま残ります。(私はそれが問題になることを非常に疑っていますが、ファイルを元に戻してください!)

楽しみ。

参考文献

重要な編集

  1. HEADビルド番号の計算に使用しないようにします。開発中にビルドを実行するとき、および後で安定版をインストールするとき (またはベータからメイン リリースへの移行を実行するとき) に、バージョン ダウングレードの問題が発生します。代わりにmaster(または本番ビルドに使用されるブランチ) ref を使用します。

PS: AS ユーザーに関連: Android Studio/Gradle を使用して git describe から Android プロジェクトを自動的にバージョン管理する

于 2013-12-14T13:56:35.677 に答える
8

Android Studio (Gradle) の使用:

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")
        ...
    }
}
于 2014-09-07T06:10:05.777 に答える
0
'  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)
于 2013-03-03T14:20:13.397 に答える