gradle - 如何在build.gradle中以编程方式从具有动态版本的依赖项中获取已解析的版本(静态版本)?
问题描述
使用 gradle,我有一个使用动态版本声明的依赖项
ext {
fooLibVersion = [1.0.0, 1.0.999]
}
dependencies {
implementation "org.examble:foo-lib:$fooLibVersion"
}
现在我想用指向 javadoc 的链接创建我的项目的 javadoc lib-foo
,为此我有
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/
如何以编程方式获取解析的版本,IINM 也称为“静态版本”,foo-lib
(它是用动态版本声明的),并在 javadoc 链接参数的变量部分中使用它?
解决方案
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/"
)
}
}
推荐阅读
- reactjs - 尝试将 react.js 网站部署到 github 时出现错误 404
- python - 如何使用 pandas 读取 csv - 行格式
- python-3.x - 如何将选定的记录从一个 DynamoDB 表复制到另一个?
- db2 - 如何在 CONCAT 中使用字符串
- c++ - ld 工具可以找到库,但 mingw 不能(linux)
- azure - 使用 Arm 模板在机器人通道注册连接上设置租户 ID
- c# - Jquery.ajax 将 null 发送到控制器,但使用硬编码的变量
- web-services - SoapUI 中的转储文件是什么格式的?
- c - 在循环读取和写入一次后,我无法使用管道的写入和读取功能
- python - time.sleep 使 tkinter 崩溃还有什么我可以使用的吗