Пользовательская активная задача, связанная с ароматом, включенная в процесс сборки

В среде сборки Android Gradle:

В настоящее время я читаю мой Код версии и Имя версии из локального файла version.properties с помощью задачи gradle "readVersions". Я нахожусь в процессе добавления ароматов в мое приложение. Эти ароматы потребуются разные версии. Поэтому я думал о том, чтобы поместить два разных файла version.properties в каталоги, специфичные для аромата (например, один / version.properties, two / version.properties), рядом с каталогами res и src, специфичными для аромата.

У меня есть задача readVersions:

task readVersions() {
    def Properties versionProps = new Properties()
    def versionPropsFile = file('version.properties')
    if (versionPropsFile.exists())
        versionProps.load(new FileInputStream(versionPropsFile))
    def v_code = (versionProps['VERSION_CODE'] ?: "0").toInteger()
    def v_name = versionProps['VERSION_NAME']

    // Set
    versionCode v_code
    versionName v_name
}

project.afterEvaluate {
    preBuild.dependsOn readVersions
}

Я хотел бы иметь новую задачу readVersions, которая включает аромат, чтобы я мог использовать его при доступе к файлу "version.properties" в каталоге "flavor".

Я пытался:

android.productFlavors.all{ flavor ->
    task ("${flavor.name}_readVersions")<<{
    def versionPropsFile = file(flavor.name+'/version.properties')
...

Но тогда я не знаю, как заставить только задачу активного аромата запускаться во время шага "preBuild".

Концептуально я хочу это:

project.afterEvaluate {
    preBuild.dependsOn ${active_flavor}_readVersions
}

Тем, кто рекомендует реорганизацию и поиск более простых решений. Мой процесс сборки в настоящее время имеет другие зависимости от этих файлов version.properties. Я мог бы просто определить код версии и название версии в двух местах (например, внутри "flavour", а также в файле "version.properties" ароматизатора, но мне действительно нужны DRY-конфигурации)

1 ответ

Решение

Я разделил мою задачу "readVersions" на "readVersionName" и "readVersionCode"

def getVersionName(flavor) {
    return getVersion(flavor, "VERSION_NAME", false)
}
def getVersionCode(flavor) {
    return getVersion(flavor, "VERSION_CODE", true)
}
def getVersion(flavor, type, intRequired) {
    // READ
    def Properties versionProps = new Properties()
    def versionPropsFile = file("${flavor}/version.properties")
    if (versionPropsFile.exists())
        versionProps.load(new FileInputStream(versionPropsFile))
    def value = versionProps["${type}"]
    return intRequired ? value.toInteger() : value
}

Затем я запускаю их внутри определения каждого аромата:

productFlavors {
    one {
        versionName getVersionName("one")
        versionCode getVersionCode("one")
    }
    two {
        versionName getVersionName("two")
        versionCode getVersionCode("two")
    }

Стоит отметить, что моя предыдущая попытка заключалась в том, чтобы включить параметры versionName и versionCode в зависимости от задачи preBuild. Похоже, что к этому времени "versionName" больше не может быть правильно установлен. В моих задачах не было правильной настройки, поэтому я и придумал другое решение, но после его прочтения он всегда был "нулевым".

Спасибо CommonsWare за комментарии и предложения.

Другие вопросы по тегам