Как импортировать вспомогательный класс в buildSrc / build.gradle.kts, settings.gradle.kts и build.gradle.kts? - PullRequest
0 голосов
/ 16 февраля 2020

Я хотел бы создать класс, который поможет мне загружать различные типы свойств (local.properties, gradle.properties, $GRADLE_HOME/gradle.properties, переменные среды, системные свойства и файлы пользовательских свойств (возможно, в других форматах, таких как * 1004). *, xml, et c.).

Кроме того, я хотел бы использовать это в моих buildSrc/build.gradle.kts, settings.gradle.kts и build.gradle.kts.

Пожалуйста Учтите, что мы используем Gradle 6.+.

. Простая реализация этого класса (полная реализация будет намного более мощной):

plugins / properties / build .gradle.kts:

package com.example

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

Как мы можем успешно импортировать этот класс Properties во все эти файлы (buildSrc/build.gradle.kts, settings.gradle.kts, build.gradle.kts) и использовать его оттуда Что-то вроде:

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

Можем ли мы сделать это, создав этот класс внутри плагина и применить его оттуда? Без предварительной компиляции и выпуска плагина? Может быть что-то вроде:

apply ("plugins / properties / b" uild.gradle.kts ")

Как бы это было минимальной реализацией для этого?

Я пробовал разные подходы, но не смог найти способ, который бы работал с эти 3 файла в целом.

1 Ответ

0 голосов
/ 18 февраля 2020

Я не совсем доволен этим подходом, но, возможно, он может помочь другим. Я не смог повторно использовать класс, но функцию во всех местах, например:

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)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...