具有扩展名的自定义Gradle插件执行任务不正确使用输入

Custom Gradle Plugin Exec task with extension does not use input properly

我正在关注Gradle文档的Writing Custom Plugins部分,特别是关于从构建中获取输入的部分。 文档提供的以下示例与预期完全一致:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apply plugin: GreetingPlugin

greeting.message = 'Hi from Gradle'

class GreetingPlugin implements Plugin<Project> {
    void apply(Project project) {
        // Add the 'greeting' extension object
        project.extensions.create("greeting", GreetingPluginExtension)
        // Add a task that uses the configuration
        project.task('hello') << {
            println project.greeting.message
        }
    }
}

class GreetingPluginExtension {
    def String message = 'Hello from GreetingPlugin'
}

输出:

1
2
> gradle -q hello
Hi from Gradle

我想让自定义插件执行外部命令(使用Exec任务),但是当将任务更改为某种类型(包括Exec以外的类型,如Copy)时,构建的输入将停止正常工作:

1
2
3
4
// previous and following sections omitted for brevity
project.task('hello', type: Exec) {
    println project.greeting.message
}

输出:

1
2
> gradle -q hello
Hello from GreetingPlugin

有谁知道这个问题是什么?


它与任务的类型无关,这是典型的<<误解。

当你写作

1
2
3
project.task('hello') << {
    println project.greeting.message
}

并执行gradle hello,会发生以下情况:

配置阶段

  • 应用自定义插件
  • 创建任务你好
  • set greeting.message ='嗨,来自Gradle'
  • 执行阶段

  • 用空体运行任务
  • 执行<< closure {println project.greeting.message}
  • 在这种情况下,输出是来自Gradle的Hi

    当你写作

    1
    2
    3
    project.task('hello', type: Exec) {
        println project.greeting.message
    }

    并执行gradle hello,发生以下情况

    配置阶段

  • 应用自定义插件
  • 创建exec任务你好
  • 执行任务初始化闭包println project.greeting.message
  • set greeting.message ='嗨,来自Gradle'(太晚了,它是在第3步中打印出来的)
  • 其余的工作流程并不重要。



    所以,小细节很重要。这是同一主题的解释。


    解:

    1
    2
    3
    4
    5
    6
    7
    void apply(Project project) {
        project.afterEvaluate {
            project.task('hello', type: Exec) {
                println project.greeting.message
            }
        }
    }