[英]How to import a helper class in buildSrc/build.gradle.kts, settings.gradle.kts, and build.gradle.kts?
I'd like to create a class to help me loading different types of properties ( local.properties
, gradle.properties
, $GRADLE_HOME/gradle.properties
, environment variables, system properties, and custom properties files (maybe in other formats like yml
, xml
, etc.).我想创建一个类来帮助我加载不同类型的属性(
local.properties
、 gradle.properties
、 $GRADLE_HOME/gradle.properties
、环境变量、系统属性和自定义属性文件(可能是其他格式,如yml
, xml
等)。
Also, I'd like to use this in my buildSrc/build.gradle.kts
, settings.gradle.kts
, and build.gradle.kts
.另外,我想在我的
buildSrc/build.gradle.kts
、 settings.gradle.kts
和build.gradle.kts
。
Please consider that we are using Gradle 6.+
.请考虑我们使用的是
Gradle 6.+
。
A simple implementation of this class would be (the full implementation would be a lot of more powerful):这个类的一个简单实现是(完整的实现会更强大):
plugins/properties/build.gradle.kts:
插件/属性/build.gradle.kts:
package com.example
object Properties {
val environmentVariables = System.getenv()
}
How can we successfully import this Properties
class in all of those files ( buildSrc/build.gradle.kts
, settings.gradle.kts
, build.gradle.kts
) and use it from there?我们如何在所有这些文件(
buildSrc/build.gradle.kts
、 settings.gradle.kts
、 build.gradle.kts
)中成功导入这个Properties
类并从那里使用它? Something like:就像是:
println(com.example.Properties.environmentVariables["my.property"])
println(com.example.Properties.environmentVariables["my.property"])
Can we do that creating this class inside of a plugin and applying it from there?我们可以在插件中创建这个类并从那里应用它吗? Without pre-compiling and releasing the plugin?
没有预编译和发布插件? Maybe something like:
也许是这样的:
apply("plugins/properties/build.gradle.kts")
应用(“插件/属性/build.gradle.kts”)
How would it be a minimal implementation for this?这将如何成为最小的实现?
I tried different approaches but I'm not being able to find a way that work with those 3 files altogether.我尝试了不同的方法,但我无法找到一种完全处理这 3 个文件的方法。
I'm not completely satisfied with this approach but maybe it can help others.我对这种方法并不完全满意,但也许它可以帮助其他人。 I wasn't able to reuse a class but a function in all places, like this:
我无法在所有地方重用一个类而是一个函数,如下所示:
settings.gradle.kts settings.gradle.kts
apply("plugin/properties/build.gradle.kts")
@Suppress("unchecked_cast", "nothing_to_inline")
inline fun <T> uncheckedCast(target: Any?): T = target as T
val getProperty = uncheckedCast<(key: String) -> String>(extra["getProperty"])
println(getProperty("group"))
buildSrc/build.gradle.kts buildSrc/build.gradle.kts
apply("../plugin/properties/build.gradle.kts")
@Suppress("unchecked_cast", "nothing_to_inline")
inline fun <T> uncheckedCast(target: Any?): T = target as T
val getProperty = uncheckedCast<(key: String) -> String>(extra["getProperty"])
println(getProperty("group"))
build.gradle.kts build.gradle.kts
// Can be used inside of the file
apply("plugin/properties/build.gradle.kts")
@Suppress("unchecked_cast", "nothing_to_inline")
inline fun <T> uncheckedCast(target: Any?): T = target as T
val getProperty = uncheckedCast<(key: String) -> String>(extra["getProperty"])
println(getProperty("group"))
buildScript {
// Since the other getProperty is not visible here we need to do this again.
apply("plugin/properties/build.gradle.kts")
@Suppress("unchecked_cast", "nothing_to_inline")
inline fun <T> uncheckedCast(target: Any?): T = target as T
val getProperty = uncheckedCast<(key: String) -> String>(extra["getProperty"])
println(getProperty("group"))
}
plugin/properties/build.gradle.kts插件/属性/build.gradle.kts
import java.io.File
import java.nio.file.Path
import java.nio.file.Paths
import java.util.Properties as JavaProperties
import org.gradle.api.initialization.ProjectDescriptor
object Properties {
lateinit var rootProjectAbsolutePath : String
val local: JavaProperties by lazy {
loadProperties(JavaProperties(), Paths.get(rootProjectAbsolutePath, "local.properties").toFile())
}
val environment by lazy {
System.getenv()
}
val system: JavaProperties = JavaProperties()
val gradle: JavaProperties by lazy {
loadProperties(JavaProperties(), Paths.get(rootProjectAbsolutePath, "gradle.properties").toFile())
}
val globalGradle: JavaProperties by lazy {
loadProperties(JavaProperties(), Paths.get(System.getProperty("user.home"), ".gradle", "gradle.properties").toFile())
}
fun containsKey(vararg keys: String): Boolean {
if (keys.isNullOrEmpty()) return false
keys.forEach {
when {
local.containsKey(it) -> return true
environment.containsKey(it) -> return true
system.containsKey(it) -> return true
gradle.containsKey(it) -> return true
globalGradle.containsKey(it) -> return true
}
}
return false
}
fun get(vararg keys: String): String {
return this.getAndCast<String>(*keys) ?: throw IllegalArgumentException("Property key(s) ${keys} not found.")
}
fun getOrNull(vararg keys: String): String? {
return getAndCast<String>(*keys)
}
inline fun <reified R> getOrDefault(vararg keys: String, default: R?): R? {
return getAndCast<R>(*keys) ?: default
}
inline fun <reified R> getAndCast(vararg keys: String): R? {
if (keys.isNullOrEmpty()) return null
keys.forEach {
val value = when {
local.containsKey(it) -> local[it]
environment.containsKey(it) -> environment[it]
system.containsKey(it) -> system[it]
gradle.containsKey(it) -> gradle[it]
globalGradle.containsKey(it) -> globalGradle[it]
else -> null
}
// TODO Improve the casting using Jackson
if (value != null) return value as R
}
return null
}
private fun loadProperties(target: JavaProperties, file: File): JavaProperties {
if (file.canRead()) {
file.inputStream().use { target.load(it) }
}
return target
}
}
if (rootProject.name == "buildSrc") {
Properties.rootProjectAbsolutePath = rootDir.parent
} else {
Properties.rootProjectAbsolutePath = rootDir.absolutePath
}
extra["getProperty"] = {key: String -> Properties.get(key)}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.