如何在 Groovy(如 Gradle)中设置闭包属性



这是我不明白的 Gradle 文档:

idea {
  //if you want parts of paths in resulting files (*.iml, etc.) to be replaced by variables (Files)
  pathVariables GRADLE_HOME: file('~/cool-software/gradle')
  module {
    //if for some reason you want to add an extra sourceDirs
    sourceDirs += file('some-extra-source-folder')

它设置idea.module.sourceDirs值。

如何在没有 Gradle 的纯 Groovy 中实现它?我想知道它潜在的唯利是图。

谢谢@Steinar,我使用以下代码修复:

def file(String p) {
    new File(p)
}
class Idea {
    class Module {
        Set<File> excludeDirs = []
    }
    void module(Closure c) {
        c.delegate = new Module()
        c()
    }
}
void idea(Closure c) {
    c.delegate = new Idea()
    c()
}
idea {
    module {
        excludeDirs += file("smth")
    }
}

使用您提出的解决方案@asullaherc您无法在调用idea { moduleidea.module { ...之间进行选择,因此我宁愿选择不同的解决方案。

这是要为案例创建的所有闭包的基类:

class SectionBase extends Closure<Object> {
    SectionClosure() {
        super(null)
    }
    Object doCall(final Closure inner) {
        inner.delegate = this
        inner()
    }
}

这将是一个实现("Gradle 风格"):

class DependenciesSection extends SectionBase {
    void compile(packageName) {
        println "compile: $packageName"
    }
    void testCompile(packageName) {
        println "testCompile: $packageName"
    }
}

现在我们做一个实例:

def dependencies = new DependenciesSection()

并稍微弄乱一下:

// You can do it either this way...
dependencies {
    compile 'com.my.package1'
    compile 'com.my.package2'
    testCompile 'com.my.package3'
}
// ...or also the other
dependencies.compile 'com.my.package4'
dependencies.testCompile 'com.my.package5'

输出将是:

compile: com.my.package1
compile: com.my.package2
testCompile: com.my.package3
compile: com.my.package4
testCompile: com.my.package5

最新更新