2

次の Gradle-Task/Plugin-Combination が与えられた場合

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ユーザーがを 2 つの異なる方法で使用できるプラグインをユーザーに提供したいと考えています。

第1の方法

を使用して、次のような構成ブロックでGreetingPluginExtensionプラグイン提供のタスクを構成します。hello

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

2番目の方法

ユーザーがタスクを明示的に定義/作成し、次のようにタスク定義で必要な値を設定できるようにします。

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

messageオブジェクトから直接andgreeterプロパティを使用GreetingTaskして挨拶を出力するか、 task-action を use に変更できることがわかりましたproject.greeting.message

柔軟性を高めるにはどうすればよいですか? ユーザーに両方を使用するオプションを提供したいと考えています。

4

1 に答える 1

0

私が望むものを達成する方法を見つけたようです...

以下、変更した部分のみ。問題は、これが私が望むものを達成するための gradle-way(tm) であるかどうかわからないことconventionMappingsです。参照: Gradle plugin: Convention vs. ExtensionおよびHow do you use a ConventionMapping to do the following? (SO経由:JavaでGradleプラグインプロパティ拡張を定義する正しい方法は?

誰かがより良い提案をしていますか? それともこれが最善のアプローチですか?

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()}"
    }
}
于 2013-09-23T10:59:56.317 に答える