首页 文章

如何在Groovy中设置闭包属性,就像在Gradle中一样?

提问于
浏览
1

这是Gradle documentation,我不明白:

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中实现它?我想知道它潜在的机制 .

2 回答

  • 1

    谢谢@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")
        }
    }
    
  • 0

    使用您提出的解决方案@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
    

相关问题