问题:
在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
尝试在任务之间传递信息,但这只是偶然的不是必需。另外,我正在使用两个任务,我完全愿意仅使用1个任务,但是,这并不能真正回答一个总体问题,这是我试图将Gradle用作项目跨平台bash替换项目时经常遇到的问题。相关任务。
解决您的特定问题(如果我没有错过某些问题(,您不需要第二个任务。只需在您的Tar
任务中添加doFirst
闭合,然后将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刚刚引入了懒惰配置的相当新的功能:Provider
和Property
gradle提供懒惰的属性,该属性延迟了属性值的计算,直到绝对需要。
Grad 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
的配置参数都可以轻松绑定(查看上面的链接(,您也可以通过将其包装到Provider
中,但也很难读取配置参数,但是它很难将提供商值放入旧配置参数中。您仍然需要指定时刻进行评估时(在任务操作中,在doFirst
闭合或afterEvaluate
处理程序中(。这个问题是关于GitHub的讨论的主题。