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

时间:2016-06-24 01:22:03

标签: gradle gradle-plugin

我正在关注Gradle文档的Writing Custom Plugins部分,特别是关于Getting input from the build的部分。文档提供的以下示例完全按预期工作:

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'
}

输出:

> gradle -q hello
Hi from Gradle

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

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

输出:

> gradle -q hello
Hello from GreetingPlugin

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

1 个答案:

答案 0 :(得分:1)

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

撰写时

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

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

配置阶段

  1. 应用自定义插件
  2. 创建任务问候
  3. 设置greeting.message =&#39;您好,来自Gradle&#39;
  4. 执行阶段

    1. 使用空身体运行任务
    2. 执行&lt;&lt;关闭{println project.greeting.message}
    3. 在这种情况下,输出是来自Gradle的Hi

      撰写时

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

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

      配置阶段

      1. 应用自定义插件
      2. create exec task hello
      3. 执行任务初始化println project.greeting.message
      4. 设置greeting.message =&#39;嗨,来自Gradle&#39; (为时已晚,已在步骤3中打印)
      5. 剩下的工作流程并不重要。

        <小时/> 所以,小细节很重要。 Here's对同一主题的解释。

        <强>解决方案:

        void apply(Project project) {
            project.afterEvaluate {
                project.task('hello', type: Exec) {
                    println project.greeting.message
                }
            }
        }