Gradle依赖于动态变量

时间:2016-10-04 09:51:06

标签: gradle groovy build.gradle

请参阅以下方案:

def dynamic = "original value"

task stuffThatHasToBeDoneBefore << {
    doSomething(dynamic)
}

task b (dependsOn: stuffThatHasToBeDoneBefore) {
    dynamic = "value of task b that never will be used by stuffThatHasToBeDoneBefore-task"
}

task c (dependsOn: stuffThatHasToBeDoneBefore) {
    dynamic = "value of task c"
}

我想在构建执行中多次使用stuffThatHasToBeDoneBefore-task来减少代码重复。

现在不可能执行任务b并且确保stuffThatHasToBeDoneBefore-task将事先用动态值执行(&#34;任务b的值,它永远不会被stuffThatHasToBeDoneBefore使用-task&#34;),因为动态变量值将在配置阶段由任务c覆盖(&#34;任务c&#34的值;)。

我认为这样做的唯一方法如下:

task b_alternative << {
    dynamic = "value of task b that will be used in stuffThatHasToBeDoneBefore-task now"
    tasks.stuffThatHasToBeDoneBefore.execute()
}

不幸的是,这只是一种解决方法,我在多个来源中读到,建议不要使用tasks.taskname.execute()

有人能告诉我如何构建代码,以便我可以将stuffThatHasToBeDoneBefore-task重用于动态值吗?

通常我会使用一个简单的方法而不是任务,并将动态值作为参数传递,但这是不可能的,因为stuffThatHasToBeDoneBefore-task是一个Zip类型的任务,只能用作任务和不是一种方法。

1 个答案:

答案 0 :(得分:1)

您的问题的解决方案是使用custom task。 您可以让自定义任务扩展ZipTask,并且可以在其上定义自定义dynamic属性,以及使用它的doSometing方法。然后,将doSomething添加到doFirstdoLast,具体取决于您希望它执行的时间(在压缩之前或之后)。

您的构建脚本变得更具表现力:

// import MyCustomTask here
task b (type: MyCustomTask) {
   dynamic = "value for task b"
}
task a (type: MyCustomTask) {
   dynamic = "value for task a"
}

请注意,dynamic不再是构建脚本中的变量,它现在是自定义任务的属性。