我有一个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
答案 0 :(得分:2)
如果每个Test
任务的每次运行都需要您的脚本,只需确保在每个Test
任务之前执行它。为什么甚至使用任务呢?
subprojects {
tasks.withType(Test) {
doFirst {
exec {
workingDir 'scripts'
commandLine 'python3', 'myscript.py'
}
}
}
}