通过属性将两个Gradle任务连接在一起 问题是:

通过属性将两个Gradle任务连接在一起 问题是:,gradle,Gradle,在Gradle中,如何使一个任务的输出成为属性,而另一个任务的输入成为相同的属性?尤其是在配置时需要该属性的情况下 我正在努力实现的目标: 我正试图编写一个依赖于用户输入的Tar任务。考虑到“baseName”在配置时不为人所知,我对惰性配置的需求遇到了问题 代码 这是我想要的工作,但它没有 task saveDb(type: Tar, dependsOn: getTarBaseName) { // Next line doesn't work but does if I surroun

在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
属性设置为您想要的:

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
处理程序中)。这个问题是我们讨论的主题