我在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]语法将一个属性包含在另一个属性中。
我认为这对将来读到这篇文章的人会有帮助。
因为我把它留在这里了