[英]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塊中任務的臨時目錄,而不是直接引用文件的路徑。 這是為了在加載腳本時不需要解析工件。 否則,即使在執行不相關的任務(包括諸如clean
和tasks
類的基本任務)時,工件也需要解析(並可能下載),如果工件無法解析,則會導致構建失敗。
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.