在Gradle插件中定义任务的正确方法是什么?

时间:2013-04-26 10:42:41

标签: plugins gradle

我正在尝试创建我的第一个Gradle插件 1.添加属性的扩展名:project.extensions.create("abc", AbcExtension)
2.定义复制任务。当我按照以下方式定义任务时

project.task("abcTask", type: Copy) {
  from project.abc.fromPath
  into project.abc.intoPath
}

project.abc.fromPath等于AbcExtension.fromPath值 - 它不会读取build.gradle的值。
当我按照以下方式定义任务时

project.task("abcTask", type: Copy) << {
  from project.abc.fromPath
  into project.abc.intoPath
}

它始终打印UP-TO-DATE并且不运行任务。

请解释一下这种行为,并告诉我在Gradle插件中定义任务的正确方法是什么(typedependsOn functionallity

1 个答案:

答案 0 :(得分:12)

插件必须推迟每次读取可变构建模型值(即可以从构建脚本设置的任何内容),直到至少结束配置阶段。有几种方法可以实现这一目标。其中包括:

  • 使用接受闭包作为值的Gradle API(例如Copy.from
  • 使用project.afterEvaluate {}gradle.projectsEvaluated {}
  • 等回调
  • 使用约定映射机制(请注意,这不被视为公共功能)

为手头的工作选择最佳选择需要一些专业知识。 (可能有助于研究Gradle codebase中的一些插件。)在您的情况下,我可能会执行以下操作:

project.task("abcTask", type: Copy) {
    from { project.abc.fromPath }
    into { project.abc.intoPath }
}

您的<<版本不起作用,因为它太晚配置Copy任务。一般来说,所有配置都应该在配置阶段进行,而不是在执行阶段进行。您可以在Gradle User Guide中了解有关Gradle构建阶段的更多信息。