gradle - 如何在build.gradle中以编程方式从具有动态版本的依赖项中获取解析版本(静态版本)?

标签 gradle

使用gradle,我有一个动态版本声明的依赖项

ext {
    fooLibVersion = [1.0.0, 1.0.999]   
}
dependencies {
    implementation "org.examble:foo-lib:$fooLibVersion"
}
现在,我想创建项目的javadoc,并链接到lib-foo javadoc,为此,我拥有
javadoc {
    …
    options {
        links = [
            "https://example.org/foo-lib/releases/$fooLibVersion/javadoc/"
        ]
    }
}
但是,这当然会失败
javadoc: error - Malformed URL: https://example.org/foo-lib/releases/[1.0.0, 1.0.999]/javadoc/
如何以编程方式获取foo-lib的已解析版本IINM(也称为“静态版本”)(已用动态版本声明),并在javadoc link参数的可变部分中使用它?

最佳答案

Gradle似乎没有提供开箱即用的干净方法。例如,(Kotlin DSL),获得对实际依赖关系的引用不会产生已解析的版本:

val commonsLangVersion by extra { listOf("3.9", "3.10") }

dependencies {
    implementation("org.apache.commons:commons-lang3:$commonsLangVersion")
}

configurations.compileClasspath.get().allDependencies.find { it.name == "commons-lang3" }?.let {
    println(it)
}
结果是:
$ ./gradlew build

> Configure project :
DefaultExternalModuleDependency{group='org.apache.commons', name='commons-lang3', version='[3.9, 3.10]', configuration='default'}
因此,获取实际版本的唯一方法是解析配置,然后根据文件名执行一些子字符串操作:
val commonsLangVersion by extra { listOf("3.9", "3.10") }

dependencies {
    implementation("org.apache.commons:commons-lang3:$commonsLangVersion")
}

val resolvedVersion = configurations.compileClasspath.get().resolve()
        .filter { it.name.startsWith("commons-lang3") }[0] // commons-lang3-3.10.jar
        .name.substringAfterLast("-") // 3.10.jar
        .substringBeforeLast(".") // 3.10

println(resolvedVersion)

tasks.javadoc {
    options {
        (this as StandardJavadocDocletOptions)
        links = listOf(
                "https://commons.apache.org/proper/commons-lang/javadocs/api-$resolvedVersion/"
        )
    }
}

关于gradle - 如何在build.gradle中以编程方式从具有动态版本的依赖项中获取解析版本(静态版本)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63235221/

相关文章:

android - 在 build.gradle 中找不到远程 jar

selenium - 如何添加Gradle Kotlin依赖编译组: 'org.seleniumhq.selenium' ?

android - Gradle同步错误Android Studio

c++ - 带有静态库的 Android Studio 中的 native C++ 代码

android - Kotlin , Gradle : mixing Android and non-Android modules

java - 如何设置具有多个级别模块的项目以进行本地开发

android - Gradle同步的Android Studio构建配置问题

java - javax.websocket.Session api

更新 firebase-perf 插件后无法编译 Android studio 项目(缺少类模块信息)

java - 当我尝试运行我的Android应用程序时,Gradle失败,原因为空白