如何设置gradle以运行特定的自定义复制任务,仅在运行单元测试时?
修改
我想按下构建时运行这些任务,i。 e仅在包含单元测试执行的构建的风格中。
答案 0 :(得分:3)
我终于在this documentation的帮助下找到了解决方案,它提供了在build
,test
,release
等期间运行的所有任务。简洁的方式。因此,通过创建任务clean
,preBuild
取决于我的copyTask
我可以确保每次清理或构建项目时都运行复制任务。
但是因为我不希望在构建或清理过程中运行它,但是当我只运行测试时想要运行它,我确定了一个编译释放单元测试源的任务,称为compileReleaseUnitTestSources
,但只是提到它在build.gradle中作为
compileReleaseUnitTestSources.dependsOn(myCopyTask)
实际上不起作用,因为gradle会发出一个错误,说它无法找到任务compileReleaseUnitTestSources
,因为某些任务尚未可用。而是将它封装在afterEvaluate
块中,我们可以确保在评估完所有任务后执行此块,这样我们现在就可以访问该任务了,所以最后我将它添加到了我的build.gradle
afterEvaluate {
compileReleaseUnitTestSources.dependsOn(copyResDirectoryToClasses)
}
这里提到的所有答案都使用dependsOn
关键字将我的任务附加到在一般构建/测试执行期间运行的另一个任务,但没有一个提到如何解决gradle无法解决的问题即使您确定这些任务可用并在构建/测试执行期间运行,也能找到任务。
答案 1 :(得分:2)
你必须设置一个“customCopyTask”,然后让单独测试的“test-task”依赖于像这样的“customCopyTask”
task customCopyTask(type: Copy) {
from sourceSets.test.resources
into sourceSets.test.output.classesDir
}
test.dependsOn customCopyTask
答案 2 :(得分:1)
你可以让一些任务完成另一个任务,在这种情况下,只有在调用另一个任务之后,此任务才会运行。这可以这样做:
task runUnitTest << {
println 'running tests'
}
task copyTestResults << {
println 'copying results'
}
//make copyTestResults finalize runUnitTest
runUnitTest.finalizedBy copyTestResults
您可以在官方user guide中了解相关信息。
此外,如果您的单元测试可能是最新的,并且您不想在这种情况下运行复制任务,则可以检查测试任务状态并跳过复制任务,如下所示:
task copyTestResults {
doFirst {
//chtck anothe task status and skip this one if it didn't actually work
if (!tasks.getByName("runUnitTest").getState().didWork) {
throw new StopExecutionException();
}
}
doLast{
println 'copying results'
}
}
或者,如果您只需要在单元测试之前运行copy-task,请通过设置dependsOn
属性来使测试任务依赖于copy-task,并使用数字og examples {读取它{3}}