通过属性将两个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尝试在任务之间传递信息,但这只是偶然的不是必需。另外,我正在使用两个任务,我完全愿意仅使用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刚刚引入了懒惰配置的相当新的功能:ProviderProperty

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及以上,所有实现PropertyProvider的配置参数都可以轻松绑定(查看上面的链接(,您也可以通过将其包装到Provider中,但也很难读取配置参数,但是它很难将提供商值放入旧配置参数中。您仍然需要指定时刻进行评估时(在任务操作中,在doFirst闭合或afterEvaluate处理程序中(。这个问题是关于GitHub的讨论的主题。

最新更新