2016-03-25 3 views
4

Я пытаюсь автоматизировать процесс сборки на CI, с которым я работаю. Я могу вызвать curl и присвоить ему некоторые переменные, такие как код версии и имена. Затем CI (в моем случае Bitrise CI) поймает его и запустит сборку Release. Однако перед этим я хочу установить код версии и имя версии на основе того, что было передано curl в файл build.gradle, а затем начать процесс.Можно ли установить код и имя версии Android с помощью задачи Gradle?

Итак, я думаю, что могу написать плагин/задачу, которая получает код/​​имя версии из командной строки, а затем вводит ее в файл build.gradle. Команда вроде ./gradlew setVersion 1 1.0.

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

Я могу написать задачу, подобную следующему коду, и поместить ее в мой основной файл build.gradle.

task setVersion << { 
    println versionCode 
    println versionName 
} 

и передать ему некоторые параметры через командную строку:

./gradlew -PversionCode=483 -PversionName=v4.0.3 setVersion 

Это мой выход:

:setVersion 
483 
v4.0.3 

BUILD SUCCESSFUL 

Total time: 6.346 secs 

До сих пор так хорошо. Мой вопрос заключается в том, как установить его в файле build.gradle? спасибо

+0

Как я прокомментировал ответ @ brwngrldev, я написал сообщение о том, как автоматизировать систему Android Build. Если вы заинтересованы, ознакомьтесь с этой статьей. https://medium.com/@hesam.kamalan/how-to-automate-android-build-process-on-bitrise-ci-part-2-b3f8124c29ee#.dnia5gg6t – Hesam

ответ

7

Вы можете создать методы для обновления VersionCode и versionName из командной строки:

def getMyVersionCode = { -> 
    def code = project.hasProperty('versionCode') ? versionCode.toInteger() : -1 
    println "VersionCode is set to $code" 
    return code 
} 

def getMyVersionName = { -> 
    def name = project.hasProperty('versionName') ? versionName : "1.0" 
    println "VersionName is set to $name" 
    return name 
} 

Тогда в андроида блока:

defaultConfig { 
     applicationId "your.app.id" 
     minSdkVersion 15 
     targetSdkVersion 23 
     versionCode getMyVersionCode() 
     versionName getMyVersionName() 

     archivesBaseName = "YourApp-${android.defaultConfig.versionName}" 
    } 

Тогда вы можете просто позвонить любой задаче на самом деле:

./gradlew assembleDebug -PversionCode=483 -PversionName=4.0.3 

Подробнее об этом здесь: https://robertomurray.co.uk/blog/2013/gradle-android-inject-version-code-from-command-line-parameter/

+0

спасибо за ваш ответ. Единственная проблема, с которой он столкнулся - на мой взгляд :) - что мне нужно передать код версии и имя для каждой задачи градиента, особенно assembleDebug. Я считаю, что другие разработчики жалуются :) Я предпочитаю иметь код версии и имя нетронутым, но эти методы вводят код версии и имя в блок конфигурации по умолчанию. Возможно ли это? Спасибо – Hesam

+1

Вы можете попробовать эту технику, она немного сложнее, чем вы хотели: http://www.jayway.com/2015/03/11/automatic-versioncode-generation-in-android-gradle/ – brwngrldev

+0

Я реализовал моя автоматизация основана на предложении #brwngrldev. Я прочитал эту статью, но не нашел ее полезной для моего дела. Преимущество ее предложения в том, что я могу поместить команду в скрипт и запустить ее легко. Я запишу его позже для других программистов. Еще раз спасибо. – Hesam