如何从 Gradle 中的另一个函数调用 buildConfigField()?

Cha*_*ltz 2 android gradle android-gradle-plugin

以下是我尝试在 Gradle 中为 Android 应用程序执行的操作的极其简化的版本:


android {

    buildTypes {

        debug {

            buildConfigFieldMyWay("keyName", "keyValue")
            buildConfigField("String", "keyName", "keyValue")  }
        }
    }

}

def buildConfigFieldMyWay(String keyName, String keyValue) {
    buildConfigField("String", keyName, keyValue)
}
Run Code Online (Sandbox Code Playgroud)

真实的版本更复杂,这就是为什么将我正在做的事情组织到单独的函数中会很好。

问题是,当我执行 Gradle 同步时,出现以下错误: No signature of method: build_byqgds5lao5ipgp4gk5ftyud4.android() is applicable for argument types: (build_byqgds5lao5ipgp4gk5ftyud4$_run_closure2) values: [build_byqgds5lao5ipgp4gk5ftyud4$_run_closure2@536e468e]

我认为这与 Android 中使用的 DSL Gradle 有关;当buildConfigField()在 内部调用时android { buildTypes { debug,它正在buildConfigField()一个BuildType对象上运行。如果我从一个单独的函数调用它,则它无法BuildType进行操作。

因此,我要么需要修改 DSL,以便buildConfigFieldMyWay()可以调用我的函数 ()android { buildTypes { debug并对BuildType对象进行操作,要么需要将 传递BuildType给该函数。我可能需要在这里使用一些简单的语法,但我没有找到。它是什么?

Gio*_*oli 7

您可以在函数内传递构建类型buildConfigFieldMyWay

def buildConfigFieldMyWay(buildType, String keyName, String keyValue) {
    buildType.buildConfigField("String", keyName, keyValue)
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下命令获取构建类型it

android {
    buildTypes {
        debug {
            buildConfigFieldMyWay(it, "keyName", "keyValue")
            buildConfigField("String", "keyName", "keyValue")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)