【发布时间】:2016-10-08 10:24:40
【问题描述】:
我想在 Gradle 获得所有可用的依赖项之后手动下载依赖项,因此我想获取 Gradle 用于下载这些构件的 URL。
有没有办法获取 Gradle 已下载工件的依赖项的 URL?
【问题讨论】:
标签: gradle
我想在 Gradle 获得所有可用的依赖项之后手动下载依赖项,因此我想获取 Gradle 用于下载这些构件的 URL。
有没有办法获取 Gradle 已下载工件的依赖项的 URL?
【问题讨论】:
标签: gradle
以 gson 为例:
dependencies {
// https://mvnrepository.com/artifact/com.google.code.gson/gson
compile 'com.google.code.gson:gson:2.8.6'
}
创建一个打印url的任务:
task getURLofDependencyArtifact() {
doFirst {
project.configurations.compile.dependencies.each { dependency ->
for (ArtifactRepository repository : project.repositories.asList()) {
def url = repository.properties.get('url')
//https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar
def jarUrl = String.format("%s%s/%s/%s/%s-%s.jar", url.toString(),
dependency.group.replace('.', '/'), dependency.name, dependency.version,
dependency.name, dependency.version)
try {
def jarfile = new URL(jarUrl)
def inStream = jarfile.openStream();
if (inStream != null) {
println(String.format("%s:%s:%s", dependency.group, dependency.name, dependency.version)
+ " -> " + jarUrl)
return
}
} catch (Exception ignored) {
}
}
}
}
}
运行./gradlew getURLofDependencyArtifact
任务:getURLofDependencyArtifact
com.google.code.gson:gson:2.8.6 -> https://jcenter.bintray.com/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar
PS:你的项目的结果依赖
repositories {
jcenter()
mavenCentral()
}
所以,结果可能是:
任务:getURLofDependencyArtifact
com.google.code.gson:gson:2.8.6 -> https://repo.maven.apache.org/maven2/com/google/code/gson/gson/2.8.6/gson-2.8.6.jar
【讨论】:
dependency.group.replace 可能会失败,因此 try 应该在 def jarUrl 行之前向上移动,IMO。
.m2 本地文件夹的依赖项。有没有办法获取工件 URL 而不是 .m2 位置?
想要类似的东西,但在 Android 和 Kotlin DSL 上,所以基于 @andforce 的回答开发了这个,希望对其他人也有用,
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
import java.net.URL
val dependenciesURLs: Sequence<Pair<String, URL?>>
get() = project.configurations.getByName(
"implementation"
).dependencies.asSequence().mapNotNull {
it.run { "$group:$name:$version" } to project.repositories.mapNotNull { repo ->
(repo as? UrlArtifactRepository)?.url
}.flatMap { repoUrl ->
"%s/%s/%s/%s/%s-%s".format(
repoUrl.toString().trimEnd('/'),
it.group?.replace('.', '/') ?: "", it.name, it.version,
it.name, it.version
).let { x -> listOf("$x.jar", "$x.aar") }
}.firstNotNullResult { url ->
runCatching {
val connection = URL(url).openConnection()
connection.getInputStream() ?: throw Exception()
connection.url
}.getOrNull()
}
}
tasks.register("printDependenciesURLs") {
doLast {
dependenciesURLs.forEach { (dependency: String, url: URL?) -> println("$dependency => $url") }
}
}
更新:但是它可能无法找到间接依赖关系。
【讨论】:
使用 Gradle 6.0 或更高版本,另一种输出 URL 的方法是将 --refresh-dependencies 与 --info 混合使用
// bash/terminal
./gradlew --info --refresh-dependencies
// cmd
gradlew --info --refresh-dependencies
或输出到文件
// bash/terminal
./gradlew --info --refresh-dependencies > urls.txt
// cmd
gradlew --info --refresh-dependencies > urls.txt
注意--refresh-dependencies
认为使用 --refresh-dependencies 是一个常见的误解 将强制下载依赖项。情况并非如此:Gradle 将 只执行刷新动态的严格要求 依赖项。这可能涉及下载新的列表或元数据 文件,甚至是工件,但如果没有任何改变,影响是 最小。
来源:https://docs.gradle.org/current/userguide/dependency_management.html
【讨论】: