【问题标题】:Reference property in Gradle PropertiesGradle 属性中的引用属性
【发布时间】:2019-10-15 05:13:16
【问题描述】:

我的 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 中定义的 versionCode。下面的代码是转换前的样子。

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

我如何在 Kotlin 中做到这一点

【问题讨论】:

  • 你为什么不把它放到 ext 而不是 gradle.properties.kts 文件
  • 这是因为它是在 azure 的构建管道上构建 apk 时使用的属性

标签: android gradle android-gradle-plugin gradle-kotlin-dsl


【解决方案1】:

由于 Gradle Kotlin DSL 的 v0.16.3(包含在 Gradle v4.7 中),因此可以对 gradle.properties 中声明的值使用属性委托,如下所示:

val yourVariable: TypeOfYourVariable by project

您的示例如下所示:

val build_version_code: String by project

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

【讨论】:

【解决方案2】:

获取它没有干净的方法,但是您可以使用 Project 接口并使用它的property() 方法来获取您的 gradle.properties.kts 变量它就像下面的代码:

project.property('your_variable_name_here')

对于您的实例:

versionCode project.property('build_version_code')

这是您可以从属性文件中设置所有变量的方法。

【讨论】:

  • 我在使用上面的方法时收到以下错误消息:java.lang.String cannot be cast to java.lang.Integer 这个意外错误的可能原因包括: Gradle的依赖缓存可能已损坏(这有时会在网络连接超时后发生。)重新下载依赖项并同步项目(需要网络)
  • 我只是忘了提到它会返回 Object 类型,尽管你需要强制转换它。如果变量是 Integer,请像这样使用:versionCode project.property('build_version_code') as Integer
  • 我已经投了它,但我仍然得到同样的错误:versionCode = project.property("build_version_code") as Int? versionName = project.property("build_version") as String?
  • 这仍然是强制转换异常还是任何新错误?
  • 仍然产生与前面所述相同的错误:java.lang.String cannot be cast to java.lang.Integer 此意外错误的可能原因包括:Gradle 的依赖缓存可能已损坏(有时会发生在网络连接超时。)重新下载依赖项并同步项目(需要网络)
【解决方案3】:

按照@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
}

【讨论】:

    【解决方案4】:

    您可以通过以下方式访问项目变量,例如端口:

    val port: String by project
    

    如果未设置端口,上述操作将失败。如果不确定,请使用

    val port: String? by project
    

    那么你可以这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      相关资源
      最近更新 更多