groovy 如何在自定义gradle插件中定义任务中的gradle任务依赖关系

kmynzznz  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(221)

我正在编写一个自定义的gradle插件,我希望在其中包含一些常见的项目任务和一个"主"任务,以控制要打开的任务。
插件中的常规任务包括:复制停靠器资源任务复制容器文件任务执行分析任务
其"主要"任务是:* * 基本项目任务**
因此,在build.gradle的项目中,我希望能够这样做:

BaseProjectTask {
  copyDockerResources = true
  copyContainerFiles = true
  performAnalysis = true
}

我希望插件的默认行为是不做任何事情,只有添加某些任务,如果他们在BaseProjectTask中打开。
我想通过在BaseProjectTask的**@TaskAction**方法中添加任务依赖关系来实现这一点:

class BaseProjectTask extends DefaultTask {

    private final BaseProjectExtension extension
    private final Project project

    @Optional
    @Input
    Boolean copyContainerFiles = false
    ...

    @Inject
    BaseProjectTask(Project project, BaseProjectExtension extension) {
        this.project = project
        this.extension = extension
    }

    @TaskAction
    def execute() {
        if (copyContainerFiles) {
            project.tasks.assemble.dependsOn(project.tasks.copyContainerFiles)
        }
        ...
    }
}

正在创建任务相关性,此行:

project.tasks.assemble.dependsOn(project.tasks.copyContainerFiles)

不起作用。
编辑:我目前的发现是,在@TaskAction中定义任务依赖性为时已晚,因为这是执行阶段。我可以在构造函数中完成(这种工作方式),但为时过早,因为属性copyContainerFiles尚未设置。
有人知道在任务类中添加代码的方法吗?这些代码将在配置阶段被触发。我想这就是我所遗漏的。

8iwquhpp

8iwquhpp1#

正如您所推测的,您需要在构建配置阶段配置任务依赖项。
@TaskAction方法中无法执行此操作。Gradle工作方式的基础是,在开始执行构建之前,它需要了解任务之间的相互依赖关系。这使Gradle能够执行一些有用的操作,例如仅执行非最新的任务,或在不实际执行任务的情况下确定将执行哪些任务。
一般来说,任务之间不应该互相知道1。
当你试图在一个插件中使用项目扩展中的值来执行这个操作时,你必须等到项目已经完成评估之后,这样构建脚本代码才能先执行。
因此,您可以执行以下操作(使用KotlinDSL3):

project.afterEvaluate {
   tasks.register("baseTask") {
      if (baseProjectExtension.copyDockerResources)
         dependsOn(tasks.getByName("copyDockerResources"))
      if (baseProjectExtension.copyContainerFiles)
         dependsOn(tasks.getByName("copyContainerFiles"))
      if (baseProjectExtension.performAnalysis)
         dependsOn(tasks.getByName("performAnalysis"))
   } 
}

1参见How to declare dependencies of a Gradle custom task?
2参见https://docs.gradle.org/current/userguide/build_lifecycle.html#sec:project_evaluation
3我所熟悉的。希望转换到Groovy不会太麻烦。

相关问题