gradle - 如何在Gradle中实现此 'dynamic block'?

标签 gradle groovy build.gradle

我是新来的。因此,请直截了当。我要实现以下块。请注意,这些库是动态的,可供其他开发人员添加所需的库。

libraries {
    slf4j 'org.slf4j:slf4j-api:1.7.21'
    junit 'junit:junit:4.12'
}

这样我就可以这样叫他们了。
dependencies {
    compile libraries.slf4j
    testCompile libraries.junit
}

我不确定如何做到。但是我从here找到了一些相关的解决方案。如下所示:
apply plugin: GreetingPlugin

greeting {
    message 'Hi'
    greeter 'Gradle'
}

class GreetingPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.extensions.create("greeting", GreetingPluginExtension)
        project.task('hello') {
            doLast {
                println "${project.greeting.message} from ${project.greeting.greeter}"
            }
        }
    }
}

class GreetingPluginExtension {
    String message
    String greeter
}

问题是当我添加到greeting块时,我也需要在GreetingPluginExtension中声明它们。任何想法如何使其仅在greeting块上更新?

最佳答案

您需要做的是利用常规的元编程。您可以在下面找到一个示例,但是功能齐全。

apply plugin: LibrariesPlugin

libraries {
    slf4j 'org.slf4j:slf4j-api:1.7.21'
    junit 'junit:junit:4.12'
}

class LibrariesPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.extensions.create("libraries", LibrariesPluginExtension)
        project.task('printLib') {
            doLast {
                println "$project.libraries.slf4j"
                println "$project.libraries.junit"

                project.libraries.each {
                    println "$it.key -> $it.value"
                }
            }
        }
    }
}

class LibrariesPluginExtension {

    Map libraries = [:]

    def methodMissing(String name, args) {
        // TODO you need to do some arg checking here
        libraries[name] = args[0]
    }

    def propertyMissing(String name) {
        // TODO same here
        libraries[name]
    }

    Iterator iterator() {
        libraries.iterator()
    }
}

关于gradle - 如何在Gradle中实现此 'dynamic block'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40743415/

相关文章:

Eclipse 颜色主题 - Groovy 支持吗?探索者和大纲?

java - 如何从命令行调用带有 'java' 的 groovy

java - 在groovy中扩展LinkedHashMap时如何覆盖equals

gradle - UnsupportedClassVersionError:javax/annotation/ManagedBean:不支持的major.minor版本51.0

Gradle includeBuild vs 实现项目

java - 由于 API 问题导致应用程序崩溃

android - Android Studio不起作用

intellij-idea - Gradle依赖关系未在IntelliJ中添加为库

java - 如何使用 Gradle java 插件将 "illegal-access=deny"传递给单元测试的 JVM 参数?

java - 如何修复 UnsatisfiedLinkError : dalvik. system.PathClassLoader?