【问题标题】:Read value from local.properties via Kotlin DSL通过 Kotlin DSL 从 local.properties 读取值
【发布时间】:2022-04-28 01:47:37
【问题描述】:

我想从local.properties 文件中检索密钥,如下所示:

sdk.dir=C\:\\Users\\i30mb1\\AppData\\Local\\Android\\Sdk
key="xxx"

并通过 gradle Kotlin DSL 将此值保存在我的 BuildConfig.java 中。然后从我的项目中访问该字段。

【问题讨论】:

    标签: android gradle kotlin gradle-kotlin-dsl


    【解决方案1】:

    好的。我找到了解决方案。

    对于 Android 项目:

    1. 在我的 build.gradle.kts 中,我创建了一个值来检索我的密钥:
    import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
    
    val key: String = gradleLocalProperties(rootDir).getProperty("key")
    
    1. buildTypes 块中我写了它:
    buildTypes {
     getByName("debug") {
        buildConfigField("String", "key", key)
       }
    }
    
    1. 现在我可以在我的 Activity 中检索此值:
    override fun onCreate() {
        super.onCreate()
        val key = BuildConfig.key
    }
    

    对于 Kotlin 项目:

    1. 我们可以创建一个扩展来帮助我们检索所需的密钥:
    fun Project.getLocalProperty(key: String, file: String = "local.properties"): Any {
        val properties = java.util.Properties()
        val localProperties = File(file)
        if (localProperties.isFile) {
            java.io.InputStreamReader(java.io.FileInputStream(localProperties), Charsets.UTF_8).use { reader ->
                properties.load(reader)
            }
        } else error("File from not found")
    
        return properties.getProperty(key)
    }
    
    1. 并在需要时使用此扩展程序
    task("printKey") {
       doLast {
           val key = getLocalProperty("key")
           println(key)
       }
    }
    

    【讨论】:

    • gradleLocalProperties 是什么?
    • 普通的kotlin项目有类似的功能吗?
    • 未解决的参考:gradleLocalProperties
    • 对于普通的 kotlin 项目,你可以参考这个答案:stackoverflow.com/a/69268957/1118475
    【解决方案2】:

    如果您无权访问gradleLocalProperties(仅适用于 android 项目):

    val prop = Properties().apply {
        load(FileInputStream(File(rootProject.rootDir, "local.properties")))
    }
    println("Property:" + prop.getProperty("propertyName"))
    

    不要忘记导入:

    import java.io.File
    import java.io.FileInputStream
    import java.util.*
    

    【讨论】:

    • 这是一个更好的解决方案,谢谢。接受的答案不仅是特定于 Android 项目的,而且它使用了可能不受官方支持的内部包中的 API。
    【解决方案3】:

    把你的财产放进去 local.properties

    并在 build.gradle(app).kts 文件中这样引用它: gradleLocalProperties(rootDir).getProperty("YOUR_PROP_NAME")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 2018-02-17
      • 2022-01-12
      • 2020-03-02
      • 1970-01-01
      相关资源
      最近更新 更多