多次运行gradle任务

多次运行gradle任务,gradle,build.gradle,Gradle,Build.gradle,我有一个gradle项目,在子目录中包含两个模块。目录结构如下所示 root module1 build.gradle module2 build.gradle build.gradle settings.gradle 顶级设置。gradle包括两个模块。顶级build.gradle包含以下内容 task runScript(type: Exec) { workingDir 'scripts' commandLin

我有一个gradle项目,在子目录中包含两个模块。目录结构如下所示

root
    module1
        build.gradle
    module2
        build.gradle
    build.gradle
    settings.gradle
顶级
设置。gradle
包括两个模块。顶级
build.gradle
包含以下内容

task runScript(type: Exec) {
    workingDir 'scripts'
    commandLine 'python3', 'myscript.py'
}

project(':module1') {
    evaluationDependsOn(':module1')

    final test = tasks.findByName('test')
    test.dependsOn(runScript)
}

project(':module2') {
    evaluationDependsOn(':module2')

    final test = tasks.findByName('test')
    test.dependsOn(runScript)
}
任务
runScript
将数据库设置为已知状态,并且在每个模块测试任务之前必须运行

当我运行测试任务时,我的脚本只执行一次。如何确保它执行多次

$ ./gradlew test 
... some output

:runScript
RUNNING MY SCRIPT

:module1:test
RUNNING MODULE1 TESTS

... some output

:module2:test
RUNNING MODULE2 TESTS
我试过的东西 我尝试将
outputs.upToDateWhen{false}
添加到任务
runScript
,因此Gradle从不认为它是最新的。这没什么区别;我假设任务在任务图中只发生一次

我尝试用
test.doFirst{runScript.execute()}
替换每个模块中包含
dependsOn
的行。当任务被执行时,这种情况会发生变化,但不会导致多次执行

$ ./gradlew test 
... some output

:module1:test
RUNNING MY SCRIPT
RUNNING MODULE1 TESTS

... some output

:module2:test
RUNNING MODULE2 TESTS
我尝试为每个模块创建一个新任务。这是可行的,但它复制了代码

project(':module1') {
    evaluationDependsOn(':module1')

    final test = tasks.findByName('test')

    task runScript(type: Exec) {
        workingDir '../scripts'
        commandLine 'python3', 'myscript.py'
    }

    test.dependsOn(runScript)
}

project(':module2') {
    evaluationDependsOn(':module2')

    final test = tasks.findByName('test')

    task runScript(type: Exec) {
        workingDir '../scripts'
        commandLine 'python3', 'myscript.py'
    }

    test.dependsOn(runScript)
}

如果每个
测试
任务的每次运行都需要脚本,只需确保在每个
测试
任务之前执行脚本即可。那么为什么还要使用任务呢

subprojects {
    tasks.withType(Test) {
        doFirst {
            exec {
                workingDir 'scripts'
                commandLine 'python3', 'myscript.py'
            }
        }
    }
}

这行不通。渐变任务在生成中只能运行一次。如果需要设置,则应使用任务特定设置的
doFirst
方法或测试特定设置的
beforeTest
方法。我希望定义任务以避免代码重复。在这个示例中,我发布了运行脚本所需的所有测试。在我的实际项目中,只有一个子集运行脚本,因为它很昂贵,而且并不总是必需的。我需要分别向任务添加任务或exec。感谢您的帮助:-)您可以使用
tasks.withType(Test)。匹配{/*any condition*/}
来配置任务的子集。