Gradle支持属性插值吗?



我在gradle.properties中找不到属性插值的语法:

prop1 = value
prop2 =${prop1}/lib

是否被支持?由于

gradle.properties是一个普通的Java属性文件,因此不支持字符串插值。我建议将所有用户定义的属性保留在build.gradle或单独的构建脚本中,这样可以提供更丰富的配置语言。例如:

gradle/properties.gradle:

ext {
    foo = "foo"
    foobar = "${foo}bar".toUpperCase()
}

build.gradle:

apply from: "gradle/properties.gradle"
println foobar

不支持字符串插值,因为gradle properties是一个普通的属性,提供了key=value语法。但是你可以实现插值。

我实现:

println("Gradle properties preprocessor : running")
val properties = Properties().apply {
    load(FileInputStream(
       File(rootProject.rootDir, "gradle.properties")
    ))
}
fun interpolate(propertyValue: String): String {
    var interpolatedPropertyValue = ""
    propertyValue
        .split("[\[\]]".toRegex())
        .forEach { variableName ->
            val variableValue = properties.getProperty(variableName) ?: return@forEach
            println("Gradle properties preprocessor : found $variableName variable")
            interpolatedPropertyValue = interpolate(
                propertyValue.replace(
                    "[$variableName]",
                    variableValue
                )
            )
        }
    return interpolatedPropertyValue.ifBlank { propertyValue }
}
val interpolatedProperties = properties.mapValues { interpolate(it.value.toString()) }
for (project in rootProject.childProjects.values) {
    println("Gradle properties preprocessor : setting variables for ${project.name} project")
    for (property in interpolatedProperties)
        project.setProperty(
            property.key.toString(),
            property.value
        )
}
println("Gradle properties preprocessor : finished")

它支持多项目项目。

你可以在github上看到我的实现。
链接现在可能会中断(当你读到这篇文章的时候)。

然后你可以这样做:

kotlinVersion=1.6.10
kotlinWrappersVersion=pre.290-kotlin-[kotlinVersion]
reactVersion=17.0.2
reactWrapperVersion=[reactVersion]-[kotlinWrappersVersion]
reactRouterVersion=6.2.1
reactRouterWrapperVersion=[reactRouterVersion]-[kotlinWrappersVersion]
styledComponentsVersion=5.3.3
styledComponentsWrapperVersion=[styledComponentsVersion]-[kotlinWrappersVersion]

使用[propertyName]语法将一个属性包含在另一个属性中。

我认为这对将来读到这篇文章的人会有帮助。
因为我把它留在这里了

最新更新