Gradle插件:如果任务A或任务B:

Gradle插件:如果任务A或任务B:,gradle,build.gradle,gradle-plugin,Gradle,Build.gradle,Gradle Plugin,我正在创建自定义插件任务,遇到了需要帮助的情况。 我创建了3个任务。gradle中的任务A、B、C。 只有当A或B获得成功时,任务C才能执行。 请注意,A和B是两个独立的任务,不相关 class A extends DefaultTask { } class B extends DefaultTask { } class C extends DefaultTask { } 如果我尝试C.dependsOn(A);C.dependsOn(B),那么我认为C同时依赖于A和B(而不是A或B)。有

我正在创建自定义插件任务,遇到了需要帮助的情况。 我创建了3个任务。gradle中的任务A、B、C。 只有当A或B获得成功时,任务C才能执行。 请注意,A和B是两个独立的任务,不相关

class A extends DefaultTask { }

class B extends DefaultTask { }

class C extends DefaultTask { }

如果我尝试
C.dependsOn(A);C.dependsOn(B),那么我认为C同时依赖于AB(而不是AB)。有没有办法在这里指定一个B条件。

您可以添加多个依赖项

task B << {
    println 'Hello from B'
}

task C << {
    println 'Hello from C'
}

task D(dependsOn: ['B', 'C'] << {
    println 'Hello from D'
}

Gradle为任务依赖关系和排序提供了四种方法(和相关容器):

样式:
t1.(t2)

  • dependsOn
    -确保在执行
    t1
    之前执行
    t2

  • finalizedBy
    -确保在执行
    t2
    后执行
    t2

  • mustRunAfter
    -确保如果执行了
    t2
    t1
    (由其他触发器引起),则
    t1
    之后执行

  • 应在
    之后运行-基本上与
    必须在
    之后运行相同,但在特殊情况下可以忽略(选中)

  • 您的需求是特殊的,无法通过上述简单方法解决。如果我没有弄错您的问题,您希望确保任务C在任务A和B之后执行,但前提是它将以任何方式执行(而不是自动触发)。对于需求的第一部分,您可以使用
    mustRunAfter
    。但是,您还需要确保任务A或任务B在之前已执行。我建议使用
    onlyIf
    方法跳过任务C的任务执行,如果之前没有执行A或B。例如:

    task A { }
    task B { }
    
    task C {
        mustRunAfter A, B
        onlyIf { A.state.executed || B.state.executed }
    }
    

    嗨,加布里埃尔,谢谢你的回复。我只是想确保任务B或C(在你的例子中)在执行D之前已经完成。我不想让D执行B或C。有什么建议吗?@SIVA_J请仔细阅读你的问题。我不知道如何认识到这种情况。可能您可以尝试finalizedBy方法,但仅具有或条件是不够的。据我所知,b.finalizedBy(d)或c.finalizedBy(d)将在b、c任务执行后触发任务d。但是我不想自动触发。我只想确保在执行D之前是否完成了B或C(任何一个)。我仍在探索动态任务
    task A { }
    task B { }
    
    task C {
        mustRunAfter A, B
        onlyIf { A.state.executed || B.state.executed }
    }