问题:
在 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 替代品时经常遇到的一个问题相关任务。
最佳答案
要解决您的特定问题(如果我没有遗漏某些内容),您不需要第二项任务。只需添加 doFirst
关闭您的Tar
任务并设置baseName
任何你想要的属性(property):
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 provides lazy properties, which delay the calculation of a property’s value until it’s absolutely required.
在 Gradle 4.0 之前,只能对文件进行惰性评估(通过
ConfigurableFileCollection
),例如:task myZip(type: Zip) {
// zip some files
}
task copyMyZip(type: Copy) {
from myZip
}
myZip.baseName = 'myZip'
即使定义了 zip 文件的名称 之后
Zip
任务添加到 Copy
任务配置,其正确路径将用于复制操作。现在,使用 Gradle 4.0 及更高版本,实现
Property
的所有配置参数或 Provider
可以很容易地绑定(bind)(查看上面的链接),您还可以通过将配置参数包装到 Provider
中来懒惰地读取配置参数,但是很难将提供者值放入旧的配置参数中。您仍然需要指定时刻当评估(在任务操作中,在 doFirst
闭包或 afterEvaluate
处理程序中)。这个问题是this discussion on GitHub的话题.
关于gradle - 通过属性将两个 Gradle 任务连接在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48810808/