5

我正在尝试创建我的第一个 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.fromPathvalue - 它不从build.gradle.
当我按照以下方式定义任务时

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

它总是打印UP-TO-DATE并且不运行任务。

请解释这种行为并告诉我在 Gradle 插件中定义任务的正确方法(具有typedependsOn功能)

4

1 回答 1

12

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

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

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

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

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

于 2013-04-26T11:33:27.210 回答