【发布时间】:2015-12-02 14:44:32
【问题描述】:
如何设置 gradle 以仅在运行单元测试时运行特定的自定义复制任务?
编辑
我想在按下 build 时运行这些任务,i。 e 仅在包含单元测试执行的构建风格中。
【问题讨论】:
标签: android android-studio gradle
如何设置 gradle 以仅在运行单元测试时运行特定的自定义复制任务?
编辑
我想在按下 build 时运行这些任务,i。 e 仅在包含单元测试执行的构建风格中。
【问题讨论】:
标签: android android-studio gradle
我终于找到了解决方案,在this documentation 的帮助下,它以非常简洁的方式呈现了在build、test、release 等期间运行的所有任务。因此,通过使任务clean、preBuild 依赖于我的copyTask,我可以确保每次清理或构建项目时都会运行复制任务。
但由于我不想在构建或清理过程中运行它,而是想在只运行测试时运行它,我确定了一个编译发布单元测试源的任务,称为 compileReleaseUnitTestSources,但只是在构建中提到它.gradle 为
compileReleaseUnitTestSources.dependsOn(myCopyTask)
实际上并没有工作,因为 gradle 会给出一个错误,说它找不到任务compileReleaseUnitTestSources,因为由于某种原因该任务还不可用。相反,通过将其包含在 afterEvaluate 块中,我们可以确保在评估所有任务之后执行该块,这样我们现在就可以访问该任务,所以最后我将它添加到我的 build.gradle
afterEvaluate {
compileReleaseUnitTestSources.dependsOn(copyResDirectoryToClasses)
}
这里的所有答案都提到使用 dependsOn 关键字将我的任务附加到在一般构建/测试执行期间运行的另一个任务,但没有一个提到如何解决 gradle 无法找到的问题即使您确定这些任务在构建/测试执行期间可用并运行。
【讨论】:
你必须设置一个“customCopyTask”并使执行单元测试的“test-task”依赖于这样的“customCopyTask”
task customCopyTask(type: Copy) {
from sourceSets.test.resources
into sourceSets.test.output.classesDir
}
test.dependsOn customCopyTask
【讨论】:
test 不可用,您需要将其包含在 afterEvaluate 块中才能运行该语句 test.dependsOn
您可以让某个任务完成另一个任务,在这种情况下,该任务只有在另一个任务被调用时才会运行,就在它之后。这可以这样做:
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,并通过一些示例 here 了解它
【讨论】:
prepareDebugUnitTestDependencies 正在运行,但是当我将这一行 prepareDebugUnitTestDependencies.dependsOn(copyResDirectoryToClasses) 放入 build.gradle(module:app) 时,我收到了这个错误 Could not find property 'prepareDebugUnitTestDependencies' on project ':app'.