2013-09-23 71 views
2

考慮下面的搖籃任務/插件,組合如何構建鬆散耦合的gradle任務屬性?

apply plugin: GreetingPlugin 

class GreetingPlugin implements Plugin<Project> { 
    void apply(Project project) { 
     project.extensions.create("greeting", GreetingPluginExtension) 

     def task = project.task('hello', type: GreetigTask) 

     //don't know how/when to populate task-properties with extension-values here. 
     //this does NOT work... properites don't get populated 
     task.message = {project.greeting.message} 
     task.greeter = {project.greeting.greeter} 
    } 
} 

class GreetingPluginExtension { 
    String message 
    String greeter 
} 

class GreetigTask extends DefaultTask { 

    def message 
    def greeter 

    @TaskAction 
    def greet() { 
     println "${message} from ${greeter}" 
    } 
} 

greeting { 
    message = 'Hi' 
    greeter = 'Gradle' 
} 

task helloDirect(type: GreetigTask) { 
    message = "howdy" 
    greeter = "direct task" 
} 

我想提供一個插件,我的用戶,用戶可以使用兩種GreetingTask不同的方式。

1路

使用GreetingPluginExtension與配置塊這樣的配置插件提供的任務hello

greeting { 
    message = 'Hi' 
    greeter = 'Gradle' 
} 

第二方式

讓用戶明確定義/創建任務並在任務定義中設置所需的值,如下所示:

task helloDirect(type: GreetigTask) { 
    message = "howdy" 
    greeter = "direct task" 
} 

我剛剛發現,我可以直接使用messagegreeter性質從GreetingTask -object打印出的問候語或更改任務行動使用project.greeting.message

我該如何獲得更大的靈活性?我希望我的用戶可以選擇使用兩者。

+0

+1使用 '鬆散耦合' 的老派短語。 – miltonb

回答

0

看起來像我發現達到我想要什麼辦法 ...

以下只是我已經改變了的部分。問題是,我不知道這是否是實現我想要的gradle-way(tm),因爲conventionMappings似乎是使用gradle的舊/過時的方式。參見:Gradle plugin: Convention vs. ExtensionHow do you use a conventionMapping to do the following?(通過SO:Correct way to define a Gradle plugin property extension with Java?

有沒有人有更好的建議?或者這是最好的方法?

conventionMappings似乎沒有記錄得很好。

class GreetingPlugin implements Plugin<Project> { 
    void apply(Project project) { 
     project.extensions.create("greeting", GreetingPluginExtension) 

     def task = project.task('hello', type: GreetigTask) 

     //using conventionMapping here 
     task.conventionMapping.message = {project.greeting.message} 
     task.conventionMapping.greeter = {project.greeting.greeter} 
    } 
} 
class GreetigTask extends DefaultTask { 

    def message 
    def greeter 

    @TaskAction 
    def greet() { 
     //excplicitly calling getters and setters here. 
     //conventionMapping-properties seem to be evaluated before class properties 
     println "${getMessage()} from ${getGreeter()}" 
    } 
}