请参阅以下方案:
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类型的任务,只能用作任务和不是一种方法。
答案 0 :(得分:1)
您的问题的解决方案是使用custom task。
您可以让自定义任务扩展ZipTask,并且可以在其上定义自定义dynamic
属性,以及使用它的doSometing
方法。然后,将doSomething
添加到doFirst
或doLast
,具体取决于您希望它执行的时间(在压缩之前或之后)。
您的构建脚本变得更具表现力:
// import MyCustomTask here
task b (type: MyCustomTask) {
dynamic = "value for task b"
}
task a (type: MyCustomTask) {
dynamic = "value for task a"
}
请注意,dynamic
不再是构建脚本中的变量,它现在是自定义任务的属性。