使任务依赖于另一个任务

时间:2014-05-21 12:40:50

标签: groovy gradle

我在gradle中尝试一些事情,我想定义一个名为“jenkins”的任务,它依赖于一个名为“test”的模块任务和另一个名为“connectedAndroidTest”的模块任务。我按照http://www.gradle.org/docs/current/userguide/more_about_tasks.html

上的说明操作

这是我的“./gradlew tasks”

的输出
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
[..]
Verification tasks
------------------
[..]
connectedAndroidTest - Installs and runs the tests for Build 'debug' on connected devices.
test - Runs the unit tests.

Other tasks
-----------
wrapper

所以我认为,这个:

task jenkins
jenkins.dependsOn test
jenkins.dependsOn connectedAndroidTest

将创建此任务,并使其依赖于其他任务,因此我的jenkins只需要运行

./gradlew jenkins

如果我要将其他任务添加到jenkins运行中,我只需要更改gradle文件,而不必触摸jenkins。

但我得到了这个令人讨厌的错误:

* What went wrong:
A problem occurred evaluating root project 'android-near-gradle'.
> Could not find property 'test' on root project 'android-near-gradle'.

task jenkins
jenkins.dependsOn unit:test
jenkins.dependsOn library:connectedAndroidTest

会导致同样的问题。

我在吸食时试过这个:

jenkins.dependsOn project(':unit').test
jenkins.dependsOn project(':library').connectedAndroidTest

导致:

* What went wrong:
A problem occurred evaluating root project 'android-near-gradle'.
> Could not find property 'test' on project ':unit'.

深入研究Gradle Objects的文档,我想出了这个:

task jenkins
jenkins.dependsOn project(':unit').tasks.getByName('test')
jenkins.dependsOn project(':library').tasks.getByName('androidConnectedTest')

但是这导致了这个错误。这可能是一个问题,因为模块可能尚未加载?!

这更奇怪,因为错误信息错误

* What went wrong:
A problem occurred evaluating root project 'android-near-gradle'.
> Task with name 'test' not found in project ':unit'.

执行时

./gradlew :unit:test

模块“单元”的“测试”任务正在执行。

我做错了什么?

3 个答案:

答案 0 :(得分:7)

声明像这样的任务依赖:

task jenkins
jenkins.dependsOn test
jenkins.dependsOn connectedAndroidTest

您需要确保已创建testconnectedAndroidTest个任务。由于您正在使用Android插件,因此很可能会延迟某些任务创建。关于该问题的可能修复是通过使用字符串表示法引用您的jenkins任务所依赖的任务。这种方式gradle应该将正确的任务连接在一起,无论它们在构建脚本(或插件)中的哪个位置被声明:

task jenkins
jenkins.dependsOn "test"
jenkins.dependsOn "connectedAndroidTest"
jenkins.dependsOn ":unit:test"

答案 1 :(得分:2)

jenkins.dependsOn ":unit:test"
jenkins.dependsOn "library:connectedAndroidTest"

实际上有效。

因此,通过字符串引用任务是一种方法,因为其他任务不是jet,因为它们是主gradle文件的模块。

答案 2 :(得分:0)

尝试:

jenkins.dependsOn project(':unit').test