Справочное свойство в свойствах Gradle

Мои файлы gradle.properties.kts имеют следующее содержимое:

build_version=develop
build_version_code=2
include_vas=false

У меня build.gradle.kts выглядит следующим образом:

plugins {
    id(Plugins.androidApplication)
    kotlin(Plugins.kotlinAndroid)
    kotlin(Plugins.kotlinExtensions)
    kotlin(Plugins.kapt)
}


android {
    compileSdkVersion(Configs.compileVersion)
    defaultConfig {
        applicationId = Configs.applicationId
        minSdkVersion(Configs.minSdkVersion)
        targetSdkVersion(Configs.targetSdkVersion)
        testInstrumentationRunner = Configs.testInstrumentationRunner
        versionCode =
    }


  buildTypes{

  }
    repositories {
        flatDir {
            dirs("libs")
        }
    }

    dependencies {
        implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.arr"))))
        implementation(Libs.stdLib)
        implementation(Libs.sunmiui)
        implementation(Libs.slf4j)
        implementation(Libs.appCompact)
        implementation(Libs.otpView)
        implementation(Libs.vectordrawableAnimated)
        implementation(Libs.materialComponents)
        implementation(Libs.recyclerView)
        implementation(Libs.constraintLayout)
        implementation(Libs.junit)
        implementation(Libs.testRunner)
        implementation(Libs.expressoCore)
        implementation(Libs.lifecyleExtensions)
        implementation(Libs.lifecyleCompiler)
        implementation(Libs.roomRuntime)
        implementation(Libs.databindingCompiler)
        implementation(Libs.rxjava)
        implementation(Libs.rxjavaAndroid)
        implementation(Libs.glide)
        implementation(Libs.glideCompiler)
        implementation(Libs.gson)
        implementation(Libs.joda)
        implementation(Libs.countrycodePicker)
        implementation(Libs.timber)
        implementation(Libs.daggerandroidSupport)
        implementation(Libs.daggerandroidProcessor)
    }

Я нахожусь в процессе преобразования моих текущих сценариев gradle в kotlin DSL. Текущая проблема, с которой я сталкиваюсь, заключается в том, что в defaultConfig:

android {
    compileSdkVersion(Configs.compileVersion)
    defaultConfig {
        applicationId = Configs.applicationId
        minSdkVersion(Configs.minSdkVersion)
        targetSdkVersion(Configs.targetSdkVersion)
        testInstrumentationRunner = Configs.testInstrumentationRunner
        versionCode =
    }

Я имею в виду код версии, определенный в gradle.properties. В приведенном ниже коде это было сделано до преобразования.

defaultConfig
        {

            multiDexEnabled true
            applicationId "jfjfjrjrjr.comn.jejeu"
            minSdkVersion 24
            targetSdkVersion 28
            versionCode build_version_code as Integer
            versionName build_version
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }

Как я могу сделать это в Котлине

Почему бы вам не перенести его в файл доб., а не в файл gradle.properties.kts

Jeel Vankhede 29.05.2019 16:42

Это связано с тем, что это свойство используется при сборке apk в конвейерах сборки Azure.

George 29.05.2019 16:46
11
2
12 535
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Нет простого способа получить его, но вы можете использовать интерфейс Проект и использовать его метод имущество() для получения из него ваших переменных gradle.properties.kts, как показано ниже:

project.property('your_variable_name_here')

Для вашего экземпляра:

versionCode project.property('build_version_code')

Вот как вы можете установить все свои переменные из файла свойств.

Я получаю следующее сообщение об ошибке, когда использую описанный выше метод: java.lang.String не может быть приведен к java.lang.Integer Возможные причины этой неожиданной ошибки включают в себя: Кэш зависимостей Gradle может быть поврежден (иногда это происходит после тайм-аута сетевого подключения). .) Повторно загрузите зависимости и синхронизируйте проект (требуется сеть)

George 29.05.2019 18:04

Я просто забыл упомянуть, что он вернет тип объекта, хотя вам нужно будет его привести. Используйте так, если переменная имеет значение Integer: versionCode project.property('build_version_code') as Integer

Jeel Vankhede 29.05.2019 18:23

Я применил его, но все равно получаю ту же ошибку: versionCode = project.property("build_version_code") as Int? versionName = project.property("build_version") как строка?

George 29.05.2019 18:32

Это все еще исключение приведения или какая-то новая ошибка?

Jeel Vankhede 29.05.2019 18:34

По-прежнему выдает ту же ошибку, о которой говорилось ранее: java.lang.String не может быть приведен к java.lang.Integer Возможные причины этой неожиданной ошибки включают в себя: Кэш зависимостей Gradle может быть поврежден (иногда это происходит после тайм-аута сетевого подключения). загрузить зависимости и синхронизировать проект (требуется сеть)

George 29.05.2019 18:36
Ответ принят как подходящий

В итоге я сделал следующее, как предложил @Jeel Vankhede:

defaultConfig {
    multiDexEnabled = true
    applicationId = Configs.applicationId
    minSdkVersion(Configs.minSdkVersion)
    targetSdkVersion(Configs.targetSdkVersion)
    var value = Integer.parseInt(project.property("build_version_code") as String?)
    versionCode = value
    versionName = project.property("build_version") as String?
    testInstrumentationRunner = Configs.testInstrumentationRunner
}

Начиная с v0.16.3 Gradle Kotlin DSL (включенного в Gradle v4.7), можно использовать делегаты свойств для значений, объявленных в gradle.properties, следующим образом:

val yourVariable: TypeOfYourVariable by project

Ваш пример будет выглядеть так:

val build_version_code: String by project

defaultConfig {
    ...
    versionCode = build_version_code    
    ...
}

ох, это довольно отстойно, все было проще, когда можно было просто сделать findProperty("build_version_code")

lasec0203 20.06.2021 06:47

пример делегатов свойств: docs.gradle.org/current/userguide/…

lasec0203 20.06.2021 06:48

Вы можете получить доступ к переменной проекта, например к порту, с помощью:

val port: String by project

Вышеприведенное не удастся, если порт не установлен. Если не уверены, используйте

val port: String? by project

Тогда вы можете сделать:

 if (port != null) {...}

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