在Gradle中,如何将一个任务的输出作为属性,另一个任务的输入是同一个属性?特别是在配置时需要该属性的上下文中。
我正在尝试编写一个取决于用户输入的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替换时经常遇到的问题相关任务。
答案 0 :(得分:1)
要解决您的具体问题(如果我没有遗漏某些内容),您就不需要第二项任务。只需在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刚刚介绍了new feature for lazy configuration:Provider
和Property
Gradle提供了延迟属性,这会延迟计算属性的值,直到绝对需要它为止。
在Gradle 4.0之前,只有文件可以延迟评估(通过ConfigurableFileCollection
),例如:
task myZip(type: Zip) {
// zip some files
}
task copyMyZip(type: Copy) {
from myZip
}
myZip.baseName = 'myZip'
即使在{/>> {/ 1}}任务添加到Zip
任务配置后
现在,使用Gradle 4.0及更高版本,可以轻松绑定实现Copy
或Property
的所有配置参数(请查看上面的链接),也可以通过包装来懒惰地读取配置参数进入Provider
,但很难将提供者值放入旧的配置参数中。您仍需要指定要评估的 时刻(在任务操作内,在Provider
闭包或doFirst
处理程序中)。这个问题是this discussion on GitHub的主题。