在没有dependsOn的情况下在任务中运行成绩任务

时间:2018-06-15 07:37:23

标签: android android-studio gradle groovy android-gradle

假设我有一组从cmd行执行的任务,它可以正常工作:

':app'

此处运行是我定义的任务。

所以我的要求是我需要创建一个执行上述4个任务的任务, 比如说新任务abc,按照相同的顺序运行上述任务,

我知道在这种情况下我不能使用dependsOn因为,在它显示的构建gradle中使用processReleaseManifest compileReleaseSource,

无法为org.gradle.api.Project类型的项目{{1}}获取未知属性{{1}}。

那么解决方案是什么?

3 个答案:

答案 0 :(得分:1)

您可以,因为@ lu.koerfer的回答表明在dependsOn列表中使用字符串来引用在构建文件中进一步定义的任务。

换句话说,这有效:

task foo {}
task bar(dependsOn: [foo]) {}

这也有效:

task bar(dependsOn: ['foo']) {}
task foo {} 

现在,要按顺序运行任务,事情就不那么直截了当了。 dependsOn属性仅告知任务在任务本身运行之前需要运行哪些任务。它 not 告诉gradle以dependsOn子句中定义的顺序运行任务。

一个例子:

task one {}
task two {} 
task three {} 
task run(dependsOn: [one, two, three]) {}
运行时

会产生以下输出:

~> gradle run
:one UP-TO-DATE
:three UP-TO-DATE
:two UP-TO-DATE
:run UP-TO-DATE

BUILD SUCCESSFUL

...请注意,我们的排名不是onetwothreerun

换句话说,命令行调用强制任务以定义的顺序运行,而dependsOn是一个集合,没有排序。

有几种方法可以让您按照自己想要的顺序运行任务。一种是定义对任务的依赖(这可能是常见的路径):

task one {}
task two(dependsOn: ['one']) {} 
task three(dependsOn: ['two']) {} 
task run(dependsOn: [one, two, three]) {}

导致:

~> gradle run
:one UP-TO-DATE
:two UP-TO-DATE
:three UP-TO-DATE
:run UP-TO-DATE

BUILD SUCCESSFUL

另一种方法是使用更高版本的gradle中添加的task ordering constructs

此外,如果您需要将任务依赖项添加到文件中较早某处定义的任务,您可以通过以下方式执行此操作:

task foo {}
someTaskDefinedFurtherUp.dependsOn 'foo'

将任务foo添加到someTaskDefinedFurtherUp的依赖项中。

答案 1 :(得分:0)

您需要将任务名称作为字符串传递给dependsOn方法,因为在您调用它时,尚未创建任务对象。但是,如果传递字符串,则稍后将评估任务名称:

task abc {
    dependsOn 'processReleaseManifest', 'compileReleaseSources', 'run', 'assembleRelease'
}

答案 2 :(得分:0)

由于通过dependsOnmustRunAfter / shouldRunAfter指定任务依赖关系和排序可能很复杂但非常复杂,我将提出另一种可能的解决方案:

您可以从Gradle调用Gradle并以与命令行相同的方式指定任务:

task abc(type: GradleBuild) {
    tasks = ['processReleaseManifest', 'compileReleaseSources', 'run', 'assembleRelease']
}

这将从当前版本中再次调用Gradle并按指定的顺序执行任务。