2016-11-22 54 views
1

我是新來的gradle。所以,請直截了當。我想要如下實現該塊。請注意,這些庫是動態的,可供其他開發人員爲所需的庫添加。如何在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塊上更新?

回答

5

你需要做的是利用groovy元編程。下面你可以找到一個樣本,但功能齊全。

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() 
    } 
}