您想在不同项目之间共享一个任务生成的特定文件。例如,一个任务生成一个文件,另一个任务读取该文件并使用其中的信息。这是跨项目边界共享信息的一种方式。(另一种方式是使用扩展对象。)
这演示了 跨项目边界共享信息的简单版本,通过明确指定要用于本地可用工件的生产者项目的可消费配置。 当生产者将工件发布到存储库时,要检索该工件,您需要使用 变体感知依赖解析的进阶版本。此方法在本地也适用。 |
示例
示例 1. 设置
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 在决定给定构建的任务顺序时,无法知道消费者和生产者之间的任务顺序。这意味着,可能在创建 jar 的生产者任务执行之前,"someOtherJar" 文件的消费者就会执行!这会导致构建完全崩溃,或者更糟糕的是,以一种微妙、不稳定且难以调试的方式崩溃。
dependencies {
// This publication model can make your build flaky and broken!
implementation project(":other").tasks.someOtherJar
}