2013-06-12 24 views
8

さて、私はXavier Ducrohetの新しいビデオであるAndroid build systemを見ました。私はAndroid Studioを使用することに切り替えましたし、それに満足しています。ビルドルールをカスタマイズして、私が望むようにする必要があります。その1つは、マニフェストファイルにcodeVersioncodeNameを自動的に設定しています。Androidスタジオのグラデルプログラミング

ザビエルは、彼のスライドの一つにこれを行う方法の開始を示しています。

def getVersionCode() { 
    def code = ... 
    return code 
} 

android { 
    defaultConfig { 
     versionCode getVersionCode() 
    } 
} 

だから、いくつかの1ドットを埋めるための優れたリソースに私を指すほど親切だろうか?

私はversionCodeを得るためにversionNamegit tag | grep -c ^vを決定するためにgit describe --dirty | sed -e 's/^v//'ようなスクリプトを実行したい。具体的に。

おかげで、私は成功せず、次のgradle.buildのスクリプトを試してみた

を更新。それはうまく構築されますが、私のインストールされたアプリのApp Infoページのバージョン名は変わりません。

task getVersionName(type:Exec) { 
    commandLine '../scripts/version-name.sh' 

    //store the output instead of printing to the console: 
    standardOutput = new ByteArrayOutputStream() 

    //extension method stopTomcat.output() can be used to obtain the output: 
    ext.output = { 
    return standardOutput.toString() 
    } 
} 

buildscript { 
    repositories { 
     maven { url 'http://repo1.maven.org/maven2' } 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.4' 
    } 
} 
apply plugin: 'android' 

dependencies { 
    compile project(':Common') 
} 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17.0.0" 

    defaultConfig { 
     minSdkVersion 7 
     targetSdkVersion 16 

     versionName getVersionName() 
    } 
} 

私はversionName 'Some Text'で設定versionName getVersionName()を交換する場合、それが動作し、ビルド名はアプリの情報でSome Textとなります。では、なぜ私のgetVersionName関数は動作しないのですか?

アップデート2

はまだ働いていない - しかし、ほとんど!

シェルスクリプトは:

#/bin/bash 

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 

logger "Build version: ${VERSION}" 

echo ${VERSION} 

これは動作し、ログ行は、プロジェクトを作成するときにスクリプトが複数回呼び出されたことを確認します。しかし、versionNameはまだ空白です。私はまだそれがstdoutを得ていない事のGradleの側面だと思う。

task getVersionCode(type: Exec) { 
    exec { commandLine '../scripts/version-code.sh' } 

    //store the output instead of printing to the console: 
    standardOutput = new ByteArrayOutputStream() 

    ext.output = { 
     return standardOutput.toString() 
    } 
} 

task getVersionName(type: Exec) { 
    exec { commandLine '../scripts/grMobile/scripts/version-name.sh' } 

    //store the output instead of printing to the console: 
    standardOutput = new ByteArrayOutputStream() 

    ext.output = { 
     return standardOutput.toString() 
    } 
} 

buildscript { 
    repositories { 
     maven { url 'http://repo1.maven.org/maven2' } 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.4' 
    } 
} 
apply plugin: 'android' 

dependencies { 
    compile project(':Common') 
} 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17.0.0" 

    defaultConfig { 
     minSdkVersion 7 
     targetSdkVersion 16 

     versionCode getVersionCode() 
     versionName getVersionName.output() 
    } 
} 
+0

おそらく、あなたはシェルスクリプトでそれをまとめて出力をキャプチャする必要があります。ここを参照してください:http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Exec.html –

+0

@Dhrubajyoti提案に感謝します。私はそれを試してみました、上記を参照してくださいしかし、まだ私が得ていないGradleのスクリプトについては何か。 – Dobbo

答えて

2

周囲を狩った後、私はついにこの解決策を見つけました。

Groovyは、build.gradleファイルの言語で、コマンドを簡単に実行できます。

def buildCode 
    = file("../scripts/version-code.sh") 
     .toString().execute().text.trim().toInteger() 
def buildName 
    = file("../scripts/version-name.sh") 
      toString().execute().text.trim() 

buildscript { 
    repositories { 
     maven { url 'http://repo1.maven.org/maven2' } 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.4' 
    } 
} 
apply plugin: 'android' 

dependencies { 
    compile files('libs/android-support-v4.jar') 
} 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17.0.0" 

    defaultConfig { 
     minSdkVersion 12 
     targetSdkVersion 16 

     versionCode buildCode 
     versionName buildName 
    } 
} 

ファイル()のGradle内のすべてのファイルを参照するために使用する必要があります。ここでのソリューションです。

"<some-command".execute().textは、 stdoutに簡単にアクセスできます。キャリッジリターンを削除するには、trim()を実行する必要があることがわかりました。私はecho -n ${VERSION}を私のスクリプトに使っていたと思いますが、trim()メソッドは、コマンドラインからスクリプトを実行できるので、より良いと思います。

ビルドスクリプトは、gitのリリースタグの数をカウントします。私は形で私のリリースをタグとして:'v' <major-no> '.' <minor-no> [ '.' <bug-fix> ]それはただの数字が続く小文字の「V」で始まるタグができます

#/bin/bash 

git tag | grep -c ^v[0-9] 

この設定でビルドする前には、少なくとも作成することを忘れないでください1つのリリースタグ。

$ git tag -m "Start of development" v0.0 
0

サンプルコメントが見つかりませんでした。 versionName getVersionName.output()が動作するはずです。

EDIT:タスクコードを次のように変更します。

task getVersionName(type:Exec) { 
    exec { commandLine '../scripts/version-name.sh' } 

    ... 
} 

私はgradleにも新しく、いくつかのバグやドキュメントが不足しているようです。試してみたコードは、サンプルから正確に得られたものです。

+0

@Dhrubajyotiありがとうございました。この修正が機能するように、versionNameが置き換えられました。ただし、置き換えられたテキストは空白です。スクリプトに問題がありますか? commandLineを "pwd"に置き換えると、空のバージョン名も生成されます。 – Dobbo

+0

@Dobbo EDIT –

+0

ご確認いただきありがとうございます。私は今本当に近くになければならない。しかし、私はまだ出力を得ていません。私はあなたが "Update 2"を見て、あなたが間違っていると思っていることを教えていただければ幸いです。 – Dobbo