多次运行gradle任务

时间:2017-11-08 17:43:58

标签: gradle build.gradle

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

namespace detail {
    enum class FuncOption {
        WithTerms,
        WithoutTerms
    };

    std::tuple<std::vector<double>, double> func_impl(FuncOption option) {
        auto const withTerms = option == FuncOption::WithTerms;
        double sum = 0.;
        std::vector<double> terms(withTerms ? 100 : 0);
        for (int i = 0; i < 100; ++i) {
            auto const result = f(i);
            if (withTerms) {
              terms[i] = result;
            }
            sum += result;
        }
        return std::make_tuple(terms, sum);
    }   
}

double func() {
    using namespace detail;
    return std::get<double>(func_impl(FuncOption::WithTerms));
}

std::tuple<std::vector<double>, double> func_terms() {
    using namespace detail;
    return func_impl(FuncOption::WithoutTerms);
}

顶级root module1 build.gradle module2 build.gradle build.gradle settings.gradle 包括两个模块。顶级settings.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},因此Gradle从不认为它是最新的。这没有任何区别;我假设因为任务仍然只在任务图中出现一次?

我尝试用runScript替换每个模块包含dependsOn的行。这在任务执行时会发生变化,但不会导致多次执行。

test.doFirst {runScript.execute()}

我尝试为每个模块创建一个新任务。这有效,但它是重复的代码。

$ ./gradlew test 
... some output

:module1:test
RUNNING MY SCRIPT
RUNNING MODULE1 TESTS

... some output

:module2:test
RUNNING MODULE2 TESTS

1 个答案:

答案 0 :(得分:2)

如果每个Test任务的每次运行都需要您的脚本,只需确保在每个Test任务之前执行它。为什么甚至使用任务呢?

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