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

fed*_*lov 5 plugins gradle

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

project.task("abcTask", type: Copy) {
  from project.abc.fromPath
  into project.abc.intoPath
}
Run Code Online (Sandbox Code Playgroud)

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

project.task("abcTask", type: Copy) << {
  from project.abc.fromPath
  into project.abc.intoPath
}
Run Code Online (Sandbox Code Playgroud)

它始终打印UP-TO-DATE,不运行任务.

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

Pet*_*ser 12

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

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

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

project.task("abcTask", type: Copy) {
    from { project.abc.fromPath }
    into { project.abc.intoPath }
}
Run Code Online (Sandbox Code Playgroud)

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