通过属性将两个Gradle任务连接在一起 问题是:
在Gradle中,如何使一个任务的输出成为属性,而另一个任务的输入成为相同的属性?尤其是在配置时需要该属性的情况下 我正在努力实现的目标: 我正试图编写一个依赖于用户输入的通过属性将两个Gradle任务连接在一起 问题是:,gradle,Gradle,在Gradle中,如何使一个任务的输出成为属性,而另一个任务的输入成为相同的属性?尤其是在配置时需要该属性的情况下 我正在努力实现的目标: 我正试图编写一个依赖于用户输入的Tar任务。考虑到“baseName”在配置时不为人所知,我对惰性配置的需求遇到了问题 代码 这是我想要的工作,但它没有 task saveDb(type: Tar, dependsOn: getTarBaseName) { // Next line doesn't work but does if I surroun
Tar
任务。考虑到“baseName”在配置时不为人所知,我对惰性配置的需求遇到了问题
代码
这是我想要的工作,但它没有
task saveDb(type: Tar, dependsOn: getTarBaseName) {
// Next line doesn't work but does if I surround 2nd param with '{}'
inputs.property("baseName", getTarBaseName.baseName) // Doesn't work
from file("$dbsDir/data")
destinationDir = file(project.dbsBackupDir)
baseName = getTarBaseName.baseName // Doesn't work
extension = 'tar'
compression = Compression.NONE
}
task getTarBaseName() {
doFirst {
def result = BuildUtil.promptForName() // Uses Swing to prompt for a name
getTarBaseName.ext.baseName = result
}
}
正如您所见,我正在使用
ext
尝试在任务之间传递信息,但这只是偶然的,不是必需的。另外,我使用了2个任务,我完全愿意只使用1个,但是,这并不能真正回答一般问题,这是我在尝试使用Gradle作为项目相关任务的跨平台bash替代品时经常遇到的问题。为了解决您的特定问题(如果我没有遗漏什么),你不需要第二个任务。只需将doFirst
闭包添加到Tar
任务中,并将那里的baseName
属性设置为您想要的:
task saveDb(type: Tar) {
// static configuration
doFirst {
baseName = BuildUtil.promptForName()
// or for another task (don't forget to depend on that task)
baseName = otherTask.myProperty
}
}
task otherTask {
doFirst {
ext.myProperty = BuildUtil.promptForName()
}
}
然而,您的问题归结为Gradle中的一个普遍困难:何时应用特定配置 Gradle刚刚介绍了一个相当不错的:
提供者
和属性
Gradle提供了惰性属性,延迟属性值的计算,直到绝对需要它为止
在Gradle 4.0之前,只能对文件进行惰性评估(通过),例如:
task myZip(type: Zip) {
// zip some files
}
task copyMyZip(type: Copy) {
from myZip
}
myZip.baseName = 'myZip'
即使在zip
任务添加到Copy
任务配置之后定义了zip文件的名称,其正确路径也将用于复制操作
现在,在Gradle 4.0及更高版本中,实现属性
或提供程序
的所有配置参数都可以轻松绑定(查看上面的链接),您还可以通过将配置参数包装到提供程序
中来懒洋洋地读取配置参数,但很难将提供者值放入旧的配置参数中。您仍然需要指定要评估的时间(在任务操作内部,在doFirst
结束或afterEvaluate
处理程序中)。这个问题是我们讨论的主题