【发布时间】:2014-12-08 12:48:10
【问题描述】:
我正在设置一个多项目 Gradle 构建来替换现有的 Ant 构建,其中所有子项目都有自己的 build.gradle 文件,其中定义了子项目的依赖项。
我的子项目都有自己的依赖项,其中有一小部分(所有 3rd 方 jar)仅在所有子项目中作为编译时依赖项需要,例如 Maven 的 provided 范围。 (我已经找到了如何在 Gradle 中创建类似行为的配置。)
但是,由于这是一小组 jar,并且它们对于所有子项目都是相同的,所以我想从各个子项目的依赖列表中提取有关提供哪些 jar 的知识,并将其放入主要构建脚本,不知何故。我希望这样做,以便向系统添加子项目的开发人员不需要知道提供了哪些依赖项,哪些没有提供。
换句话说,我希望有一个配置,对于特定的依赖项列表表现为provided,对于所有其他依赖项表现为compile。
我主要有这个build.gradle:
ext.providedDependencies = [
"org.apache.log4j:log4j:1.2.16",
"joda-time:joda-time:2.0"
]
...
configurations { myconfig }
并且一个或多个子项目的build.gradle 如下:
dependencies {
myconfig "org.apache.log4j:log4j:1.2.16"
myconfig "org.apache.commons:commons-lang3:3.3.2"
}
那么我希望行为是这样的:
dependencies {
provided "org.apache.log4j:log4j:1.2.16"
compile "org.apache.commons:commons-lang3:3.3.2"
}
因为 log4j 在 ext.providedDependencies 中,而 commons-lang3 不在。我希望我的所有子项目都具有相同的行为。
我曾尝试(部分)像这样实现myconfig:
subprojects {
dependencies {
configurations.myconfig.dependencies.each { dep ->
if (providedDependencies.contains(dep)) {
compile dep
}
}
}
}
但这不起作用,因为事实证明configurations.myconfig.dependencies 是空的(不过我不明白为什么)。换句话说,不会添加依赖项。
我也尝试过,但情况正好相反:添加了所有依赖项,包括提供的依赖项列表中的那些。
subprojects {
dependencies {
compile(configurations.myconfig) {
providedDependencies.each { exclude it }
}
}
}
请让我知道我该如何完成这项工作,或者是否有其他更好的方法来实现我想要的。
编辑为了清楚起见,部分重写了
【问题讨论】:
标签: gradle dependency-management