您想要在一個專案中的工作所建立的檔案與另一個專案中的工作分享。例如,一個工作建立一個檔案,而另一個工作會讀取該檔案並使用其中的某些資訊。這是您可以在專案界線間分享資訊的一種方式。(另一種方式是使用擴充物件。)
範例
範例 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 在決定特定建置的任務順序時,並不知道消費者與生產者之間的任務順序。這表示「someOtherJar」檔案的消費者可能會在建立 jar 的生產者任務之前執行!這會導致建置完全中斷,或更糟的是,中斷的方式難以察覺、不穩定且難以除錯。
dependencies {
// This publication model can make your build flaky and broken!
implementation project(":other").tasks.someOtherJar
}