簡體   English   中英

如何在 Gradle 中下載和引用單個工件?

[英]How can I download and reference a single artifact in Gradle?

我正在創建一個 Gradle 任務,我想在其中下載並引用 Maven 存儲庫中存在的工件的 jar 文件。 具體來說,我計划使用該 jar 的位置作為腳本的參數,通過 Gradle exec任務調用外部腳本。 使用 exec 任務很簡單; 我想弄清楚的是如何在文件系統上獲取工件的 jar 文件的位置。

作為一個簡單而具體的示例,假設我的 Gradle 項目目錄中有以下文件:

構建.gradle:

task myScript(type: Exec) {
    executable './my_script.sh'
    args jarFilePath // How do I get this value?
}

my_script.sh:

#!/usr/bin/env bash
echo "Jar file location: $1"

如何獲取工件 jar 的文件路徑,並在必要時從遠程存儲庫下載它? 例如,如果它不在我的本地工件緩存中,或者它是更新的快照版本,則應該下載它。

讓我們假設我們想要的 jar 文件是guava-26.0-jre.jar 以下build.gradle文件將檢索工件(如有必要)並將文件位置作為腳本的參數提供:

import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.StandardCopyOption

repositories {
    mavenCentral()
}

configurations {
    myArtifact
}

dependencies {
    myArtifact group: 'com.google.guava', name: 'guava', 
            version: '26.0-jre', transitive: false
}

task myScript(type: Exec) {
    Path artifactPath = 
            temporaryDir.toPath().resolve('guava.jar').toAbsolutePath()

    doFirst {
        Files.copy(configurations.myArtifact.singleFile.toPath(), artifactPath,
                StandardCopyOption.REPLACE_EXISTING)
    }

    executable './my_script.sh'
    args artifactPath.toString()
}

這將創建一個名為“myArtifact”的自定義配置,它只依賴於guava-26.0-jre 通過將其標記為可transitive: false沒有任何工件的依賴項將包含在配置中,如果它們尚不存在於本地工件緩存中,也不會下載它們。

configurations.myArtifact.singleFile的調用返回對工件jar 文件的java.io.File引用。 getSingleFile()方法還確保集合中只有一個文件,如果有零個或多個,則拋出IllegalStateException 如果將來配置被錯誤地錯誤配置為具有多個工件(例如,如果有人從我們的腳本中刪除了“傳遞”選項),這可以防止引用錯誤的工件。

toAbsolutePath()方法確保腳本的路徑是絕對的,因此不需要相對於任何特定目錄進行解析。

請注意,這是將工件復制到doFirst塊中任務的臨時目錄,而不是直接引用文件的路徑。 這是為了在加載腳本時不需要解析工件。 否則,即使在執行不相關的任務(包括諸如cleantasks類的基本任務)時,工件也需要解析(並可能下載),如果工件無法解析,則會導致構建失敗。

StandardCopyOption.REPLACE_EXISTING選項用於覆蓋先前構建中的任何先前 jar 文件。

以下帶有復制任務copyDependencies 的代碼段適用於單個和多個依賴項。 您可以定義依賴於該任務的任何其他任務(例如類型 Exec)。

configurations {
    web {
        transitive = false
    }
}

dependencies {
    web "com.foo:foo-messaging:$version:@war",
            "com.foo:foo-ng:$version:@war"
}

task copyDependencies(type: Copy) {
    from configurations.web
    into "$buildDir/web"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM