通过财产将两个Gradle任务连接在一起

时间:2018-02-15 15:31:57

标签: gradle

问题:

在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替换时经常遇到的问题相关任务。

1 个答案:

答案 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 configurationProviderProperty

  

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及更高版本,可以轻松绑定实现CopyProperty的所有配置参数(请查看上面的链接),也可以通过包装来懒惰地读取配置参数进入Provider,但很难将提供者值放入旧的配置参数中。您仍需要指定要评估的 时刻(在任务操作内,在Provider闭包或doFirst处理程序中)。这个问题是this discussion on GitHub的主题。