Gradle 理解梯度任务相关性(dependsOn)

Gradle 理解梯度任务相关性(dependsOn),gradle,Gradle,两个问题: gradle是如何指定一个任务由多个其他任务组成的 gradle的taskName.execute()方法似乎不尊重taskName的依赖关系,这是真的吗?解决方法是什么 更多背景: 现在我有一个没有插件的构建脚本(换句话说,不是Java)。我想要一个名为tests的任务,它将运行我所有的测试任务。我有三个这样的任务。将它们称为task1、task2和task3 我可以说tests.dependsOn['task1','task2','task3'] 这有点不可靠,因为关系似乎是te

两个问题:

  • gradle是如何指定一个任务由多个其他任务组成的
  • gradle的
    taskName.execute()
    方法似乎不尊重
    taskName
    的依赖关系,这是真的吗?解决方法是什么
  • 更多背景:

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

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

    这有点不可靠,因为关系似乎是
    tests.iscomparisedof['task1','task2','task3']

    我可以说:

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

    任务测试通常,您不调用
    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'])
    
    请记住,依赖项任务的运行顺序并不总是得到保证,但您可以通过
    task2.mustRunAfter task1
    来缓解这一问题。但通常情况下,任务是按照您期望的顺序运行的

    另外,你应该仔细阅读。使用语法时,Gradle的任务模型是“扁平的”,没有聚合的概念。(需要注意的是,
    TaskInternal#execute
    是一种内部方法,不能从构建脚本中调用。)聚合通常使用生命周期任务(具有任务依赖关系但没有任何任务操作的任务)进行模拟:


    除了
    dependsOn
    ,还支持以下任务关系:
    mustRunAfter
    shouldlrunafter
    、和
    finalizedBy
    “请记住,依赖项任务的运行顺序并不总是有保证[…]不过,通常任务是按照您期望的顺序运行的。”--这很模糊,你知道在什么情况下可以依赖订单吗?你的第一个建议不适用于
    Copy
    Tar
    任务类型。“没有执行任何操作。@操作员我不知道在什么情况下,您可以依赖于列出相关任务的顺序。@IgorGanapolsky您能详细说明一下吗?”?我已经验证了这确实适用于拷贝和Tar类型。是否有可能您没有运行干净的构建,并且任务是最新的?我不知道这是否是官方记录的行为,但根据我自己的测试,如果一个任务依赖于多个其他任务,它们将按字母顺序执行<代码>任务我的任务(依赖项:['aTask','bTask'])
    任务我的任务(依赖项:['bTask','aTask'])
    做同样的事情:
    aTask
    总是在
    bTask
    $ gradle tests
    :task1
    Hello
    :task2
    World
    :task3dependency
    MR
    :task3
    QBert
    :tests
    
    BUILD SUCCESSFUL
    
    task tests << {
        task1.execute()
        task2.execute()
        task3.execute()
    }
    
    task allTests {
        dependsOn tasks.withType(Test)
    }