假设我有一组从cmd行执行的任务,它可以正常工作:
':app'
此处运行是我定义的任务。
所以我的要求是我需要创建一个执行上述4个任务的任务, 比如说新任务abc,按照相同的顺序运行上述任务,
我知道在这种情况下我不能使用dependsOn因为,在它显示的构建gradle中使用processReleaseManifest compileReleaseSource,
无法为org.gradle.api.Project
类型的项目{{1}}获取未知属性{{1}}。
那么解决方案是什么?
答案 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
...请注意,我们的排名不是one
,two
,three
,run
。
换句话说,命令行调用强制任务以定义的顺序运行,而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)
由于通过dependsOn
和mustRunAfter
/ shouldRunAfter
指定任务依赖关系和排序可能很复杂但非常复杂,我将提出另一种可能的解决方案:
您可以从Gradle调用Gradle并以与命令行相同的方式指定任务:
task abc(type: GradleBuild) {
tasks = ['processReleaseManifest', 'compileReleaseSources', 'run', 'assembleRelease']
}
这将从当前版本中再次调用Gradle并按指定的顺序执行任务。