如何在 kotlin 代码中获取在 'gradle.properties 中定义的自定义 属性?

How do I get a custom property defined in 'gradle.properties in kotlin code?

我在 gradle.properties 中添加了自定义 属性 :

libraryVersion=0.1.0-beta

如何在我发布的代码中阅读它?我想在我的 Kotlin 库中使用这个值而不对其进行硬编码。

如果您想使用 gradle 中的 属性,您可以这样做

里面app/build.gradle

plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

/******************/
def properties = new Properties()
try {
    properties.load(new FileInputStream(rootProject.file("gradle.properties")))
} catch (Exception e) {
    logger.warn("Properties not Found!")
}
/******************/

android {
    compileSdkVersion 31
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "com.test.myapplication"
        minSdkVersion 21
        targetSdkVersion 31
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        
        /********/
        buildConfigField("String", "LIBRARY_VERSION", "\"" + properties['libraryVersion'] + "\"")
        /*********/
    }
}

您可以从 BuildConfig 中获取此值

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Log.d("TAG", BuildConfig.LIBRARY_VERSION)
    }
}

您可以访问 gradle.properties 中定义的系统属性。他们应该有 systemProp. 前缀。然后在 gradle 构建文件中,你应该在程序中传递它。

这里是打印 gradle.properties 中定义的 属性 的控制台应用程序示例。

文件gradle.properties:

systemProp.libraryVersion=0.1.0-beta

文件Main.kt:

fun main(args: Array<String>) {
    val libraryVersion = System.getProperty("libraryVersion") ?: ""
    println(libraryVersion)
}

文件build.gradle.kts:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.5.10"
    application
}

group = "me.yunir"
version = "0.1"

repositories {
    mavenCentral()
}

dependencies {
    testImplementation(kotlin("test"))
}

tasks.test {
    useJUnitPlatform()
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "11"
}

application {
    mainClass.set("MainKt")
//    applicationDefaultJvmArgs = listOf(                              // 1
//        "-DlibraryVersion=${System.getProperty("libraryVersion")}"
//    )
}

tasks.named<JavaExec>("run") {                                         // 2
    systemProperty("libraryVersion", System.getProperty("libraryVersion"))
}

有 2 个变体通过系统 属性 进行编程:

  • 使用特定于“应用程序”的插件 属性 applicationDefaultJvmArgs
  • 对特定任务使用systemProperty方法

程序的输出:

0.1.0-beta

附加链接:

更新。 1

或者如果您不想使用前缀 systemProp. 并使用 gradle 项目属性,那么第二个变体将如下所示:

文件gradle.properties:

libraryVersion=0.1.0-beta

文件build.gradle.kts:

...
tasks.named<JavaExec>("run") {                                         // 2
    systemProperty("libraryVersion", findProperty("libraryVersion") ?: "")
}
...

经过一段时间的挖掘,我找到了我要找的答案

解决方法如下:

build.gradle.kts:

import java.io.FileOutputStream
import java.util.Properties

version = "1.0.0"

val generatedVersionDir = "$buildDir/generated-version"

sourceSets {
  main {
    kotlin {
      output.dir(generatedVersionDir)
    }
  }
}

tasks.register("generateVersionProperties") {
  doLast {
    val propertiesFile = file("$generatedVersionDir/version.properties")
    propertiesFile.parentFile.mkdirs()
    val properties = Properties()
    properties.setProperty("version", "$version")
    val out = FileOutputStream(propertiesFile)
    properties.store(out, null)
  }
}

tasks.named("processResources") {
  dependsOn("generateVersionProperties")
}

Library.kts:

private val versionProperties = Properties()

val version: String
  get() {
    return versionProperties.getProperty("version") ?: "unknown"
  }

init {
  val versionPropertiesFile = this.javaClass.getResourceAsStream("/version.properties")
  versionProperties.load(versionPropertiesFile)
}