首页 文章

了解Gradle任务依赖性(dependsOn)

提问于
浏览
48

两个问题:

  • 指定1个任务由其他几个任务组成的gradle方法是什么?

  • 似乎gradle的 taskName.execute() 方法不尊重 taskName 的dependsOn关系,这是真的吗?什么是解决方法?

更多背景:

现在我有一个没有插件的构建脚本(换句话说不是Java) . 我想要一个名为 tests 的任务,它将运行我所有的测试任务 . 我有3个这样的任务 . 称他们为task1,task2和task3 .

我可以说 tests.dependsOn ['task1', 'task2', 'task3']

这有点不稳定,因为这种关系似乎是 tests.isComprisedOf ['task1', 'task2', 'task3']

我可以说:

task tests << {
    task1.execute()
    task2.execute()
    task3.execute()
}

但是然后task3(它本身依赖于taskSetup)在没有运行taskSetup的情况下运行 . 换句话说,execute()调用似乎不尊重gradle的依赖关系解析策略 .

最后一个小抱怨(我真的喜欢gradle),是因为依赖在gradle中意味着两个不同的东西:dependsOn样式依赖和库样式依赖,因此很难搜索这个主题 .

2 回答

  • 47

    Gradle 's task model is 1869009 and doesn' t有一个聚合概念 . (重要的是要注意 TaskInternal#execute 是一个内部方法,不能从构建脚本中调用 . )聚合通常使用生命周期任务(具有任务依赖性但没有任何任务操作的任务)进行模拟:

    task allTests {
        dependsOn tasks.withType(Test)
    }
    

    dependsOn 外,还支持以下任务关系: mustRunAfter ,_1866015_和 finalizedBy .

  • 37

    通常,您不会调用 task.execute() .

    您可以按以下方式指定一个任务由其他任务组成:

    task task1 << {
       println "Hello"
    }
    
    task task2 << {
       println "World"
    }
    
    task task3(dependsOn: 'task3dependency') << {
       println "QBert"
    }
    
    task task3dependency << {
       println "MR"
    }
    
    task tests(dependsOn: ['task1', 'task2', 'task3'])
    

    这输出:

    $ gradle tests
    :task1
    Hello
    :task2
    World
    :task3dependency
    MR
    :task3
    QBert
    :tests
    
    BUILD SUCCESSFUL
    

    请记住,运行依赖项任务的顺序并不总是有保证,但您可以通过specifying the order task2.mustRunAfter task1 缓解此问题 . 通常,任务按照您期望的顺序运行 .

    另外,你应该阅读Gradle's Build Lifecycle . 使用语法 task task1 << {...} 时,您将指定在任务的执行阶段运行的闭包 . 在运行执行之前,配置阶段会评估构建脚本并确定要运行的任务以及按什么顺序运行 . 手动执行任务时,如:

    task tests << {
        task1.execute()
        task2.execute()
        task3.execute()
    }
    

    你绕过了Gradle评估task3的任务依赖性的能力,因此它只运行task3 .

相关问题