我正在编写一个自定义的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尚未设置。
有人知道在任务类中添加代码的方法吗?这些代码将在配置阶段被触发。我想这就是我所遗漏的。
1条答案
按热度按时间8iwquhpp1#
正如您所推测的,您需要在构建配置阶段配置任务依赖项。
在
@TaskAction
方法中无法执行此操作。Gradle工作方式的基础是,在开始执行构建之前,它需要了解任务之间的相互依赖关系。这使Gradle能够执行一些有用的操作,例如仅执行非最新的任务,或在不实际执行任务的情况下确定将执行哪些任务。一般来说,任务之间不应该互相知道1。
当你试图在一个插件中使用项目扩展中的值来执行这个操作时,你必须等到项目已经完成评估之后,这样构建脚本代码才能先执行。
因此,您可以执行以下操作(使用KotlinDSL3):
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不会太麻烦。