2013-06-12 2 views
8

Хорошо, я смотрел видео на YouTube с Ксавье Дюкрошем на новом Android build system. Я даже переключился на использование Android Studio и доволен этим. Теперь мне нужно настроить правила сборки, чтобы делать то, что я хочу, и один из них автоматически устанавливает codeVersion и codeName в файле манифеста.Программирование на Android Studio Gradle

Xavier показать начало, как сделать это в одном из своих слайдов:

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

android { 
    defaultConfig { 
     versionCode getVersionCode() 
    } 
} 

Так может кто-то быть так любезны указать мне хороший ресурс для заполнения точек?

Чтобы быть более конкретным, я хочу, чтобы запустить сценарий как git describe --dirty | sed -e 's/^v//' для определения versionName и git tag | grep -c ^v получить versionCode.

Благодаря

Update

Я пробовал следующий сценарий gradle.build без успеха. Он строит отлично, но имя версии на странице сведений о приложении моих установленных приложений не изменяется.

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 getVersionName() с versionName 'Some Text' затем он работает и имя сборки становится Some Text в App Info. Так почему же моя функция getVersionName не работает?

Update 2

До сих пор не работает - но почти!

Shell скрипт:

#/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 все еще пуст. Я подозреваю, что это сторона Gradle, которая все еще не получает stdout.

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 
    } 
} 

file() следует использовать для ссылки на весь файл в 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] 

Перед тем, как построить с этой конфигурацией не забудьте создать по крайней мере, один тег релиза. Я отмечаю в начале проекта следующим образом:

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

Вы пропустили комментарии к образцу. versionName getVersionName.output() должен работать.

EDIT: измените код своей задачи на следующее.

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

    ... 
} 

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

+0

Благодаря @Dhrubajyoti, имя версии теперь заменяется, поэтому это исправление работает. Однако замещенный текст пуст. Что-то не так с моим сценарием. Замена commandLine на «pwd» также создает пустое имя версии. – Dobbo

+0

@Dobbo Пожалуйста, проверьте EDIT –

+0

Спасибо за вашу помощь. Я должен быть очень близко. Но я все еще не выхожу на выход. Буду признателен, если вы посмотрите на «Обновление 2» и скажите мне, что вы считаете неправильным. – Dobbo