您想要在一個專案中分享由任務建立的檔案,給另一個專案中的任務使用。例如,一個任務建立一個檔案,另一個任務讀取該檔案並使用其中的一些資訊。這是您可以在專案邊界之間分享資訊的一種方式。(另一種方式是使用擴充物件。)

這示範了跨專案邊界分享資訊的簡單版本,透過明確指定哪個生產者專案的可消耗配置用於本地可用的產出物。

當生產者將產出物發布到儲存庫時,若要檢索該產出物,您將需要使用變體感知分享的高階版本。此方法也適用於本地。

範例

範例 1. 設定
settings.gradle.kts
rootProject.name = "sharing-outputs"
include("producer")
include("consumer")
settings.gradle
rootProject.name = "sharing-outputs"
include("producer")
include("consumer")
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)
}
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
}