gpt4 book ai didi

gradle - 如何在buildSrc/build.gradle.kts,settings.gradle.kts和build.gradle.kts中导入帮助程序类?

转载 作者:行者123 更新时间:2023-12-03 03:25:56 33 4
gpt4 key购买 nike

我想创建一个类来帮助我加载不同类型的属性(local.propertiesgradle.properties$GRADLE_HOME/gradle.properties,环境变量,系统属性和自定义属性文件(也许采用ymlxml等其他格式)。

另外,我想在buildSrc/build.gradle.ktssettings.gradle.ktsbuild.gradle.kts中使用它。

请考虑我们正在使用Gradle 6.+

此类的一个简单实现是(完整实现将更加强大):

plugins/properties/build.gradle.kts:


package com.example

object Properties {
val environmentVariables = System.getenv()
}

我们如何在所有这些文件( PropertiesbuildSrc/build.gradle.ktssettings.gradle.kts)中成功导入此 build.gradle.kts类并从那里使用它?就像是:

println(com.example.Properties.environmentVariables["my.property"])



我们可以在插件中创建此类并从那里应用吗?没有预编译和发布插件?也许像这样:

apply("plugins/properties/build.gradle.kts")



这将是最小的实现吗?

我尝试了不同的方法,但无法找到一种完全可用于这3个文件的方法。

最佳答案

我对这种方法并不完全满意,但也许可以帮助其他人。
我无法在所有地方重用一个类,而是一个函数,如下所示:

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
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
// 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"))
}

插件/properties/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)}

关于gradle - 如何在buildSrc/build.gradle.kts,settings.gradle.kts和build.gradle.kts中导入帮助程序类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60251228/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com