gradle - 通过属性将两个 Gradle 任务连接在一起

标签 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 替代品时经常遇到的一个问题相关任务。

最佳答案

要解决您的特定问题(如果我没有遗漏某些内容),您不需要第二项任务。只需添加 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 : ProviderProperty

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/

相关文章:

hibernate - SpringBoot hibernate gradle字节码增强

spring-boot - 记录错误Spring Boot Gradle

android - 编译 gradle 任务总是被执行

android - 为什么我的 Flutter 应用程序无法运行?漏洞!源单元中的阶段 'semantic analysis' 中的异常 '_BuildScript_' 不支持的类文件主要版本 60

gradle - 如何从Gradle设置Eclipse的输出目录

java - Android AAR lib - 资源链接失败

Gradle、Android、Jacoco 和 JUnit5

java - 如何从特定类创建 JAR 并将其与 Gradle 一起使用?

ant - 从 Gradle 调用 Ant 任务时如何拦截或提升日志消息

gradle - 由于NoClassDefFoundError而启用运行appStart任务:Lorg/jCharts/properties/PieChart2DProperties