您希望在一个项目中的任务生成的文件可以被另一个项目中的任务共享。例如,一个任务生成一个文件,另一个任务读取该文件并使用其中的一些信息。这是跨项目边界共享信息的一种方式。(另一种方式是使用扩展对象。)

这演示了跨项目边界共享信息的简单版本,通过显式指定用于本地可用构件的生产项目中的可消费配置(consumable configuration)

当生产者将构件发布到仓库时,要检索该构件,您需要使用进阶版本的变体感知依赖解析。此方法也适用于本地情况。

示例

示例 1. Settings
settings.gradle.kts
rootProject.name = "sharing-outputs"
include("producer")
include("consumer")
settings.gradle
rootProject.name = "sharing-outputs"
include("producer")
include("consumer")
示例 2. 生产者构建
producer/build.gradle.kts
val makeFile = tasks.register("makeFile") {
    val sharedFile = layout.buildDirectory.file("some-subdir/shared-file.txt")
    outputs.file(sharedFile)
    doFirst {
        sharedFile.get().asFile.writeText("This file is shared across Gradle subprojects.")
    }
}

val sharedConfiguration by configurations.creating {
    isCanBeResolved = false
}

artifacts {
    add(sharedConfiguration.name, makeFile)
}
producer/build.gradle
def makeFile = tasks.register("makeFile") {
    def sharedFile = layout.buildDirectory.file("some-subdir/shared-file.txt")
    outputs.file(sharedFile)
    doFirst {
        sharedFile.get().asFile << "This file is shared across Gradle subprojects."
    }
}

configurations {
    sharedConfiguration {
        canBeResolved = false
    }
}

artifacts {
    sharedConfiguration(makeFile)
}
示例 3. 消费者构建
consumer/build.gradle.kts
val sharedConfiguration: Configuration by configurations.creating {
    isCanBeConsumed = false
}

dependencies {
    sharedConfiguration(project(path = ":producer", configuration = "sharedConfiguration"))
}

tasks.register("showFile") {
    val sharedFiles: FileCollection = sharedConfiguration
    inputs.files(sharedFiles)
    doFirst {
        logger.lifecycle("Shared file contains the text: '{}'", sharedFiles.singleFile.readText())
    }
}
consumer/build.gradle
configurations {
    sharedConfiguration {
        canBeConsumed = false
    }
}

dependencies {
    sharedConfiguration(project("path": ":producer", "configuration": "sharedConfiguration"))
}

tasks.register("showFile") {
    FileCollection sharedFiles = configurations.getByName("sharedConfiguration")
    inputs.files(sharedFiles)
    doFirst {
        logger.lifecycle("Shared file contains the text: '{}'", sharedFiles.singleFile.text)
    }
}

另请参阅

反模式:

不要直接引用其他项目的任务

一种常见的声明跨项目依赖的反模式如下所示。

这种发布模型是不安全的,可能导致构建不可重现且难以并行化。通过这种方式声明依赖,Gradle 在决定给定构建的任务顺序时,无法知晓消费者和生产者之间的任务顺序。这意味着潜在地,文件“someOtherJar”的消费者可能会在创建该 jar 的生产者任务之前执行!这会导致构建完全失败,或者更糟,以一种微妙、不稳定且难以调试的方式失败。

dependencies {
  // This publication model can make your build flaky and broken!
  implementation project(":other").tasks.someOtherJar
}