我正在设置一个多项目Gradle构建来替换现有的Ant构建,其中所有子项目都有自己的build.gradle
文件,其中定义了子项目的依赖项
我的子项目都有自己的依赖项,其中有一小部分(所有第三方jar)只需要作为所有子项目中的编译时依赖项,例如Maven' s provided
范围。 (我已经找到了如何在Gradle中创建一个行为类似的配置。)
然而,由于这是一小组罐子,并且它们对于所有子项目都是相同的,我想从各个子项目中提取哪些罐子的知识&#39 ; s依赖列表,并以某种方式进入主构建脚本。我希望这样,以便为系统添加子项目的开发人员不需要知道提供哪些依赖项,哪些不是。
换句话说,我希望有一个配置,对于特定的依赖项列表,其行为为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 }
}
}
}
请告诉我如何才能完成这项工作,或者是否有更好的方式来实现我想要的目标。
编辑为清晰起见,部分重写
答案 0 :(得分:1)
ext{
dependencies = [
"dependencyGroup:dependencyName:dependencyVersion",
"dependency2Group:dependency2Name:dependency2Version"
]
}
subprojects{
dependencies {
provided dependencies
}
configurations {
compile.exclude group: 'dependencyGroup'
compile.exclude group: 'dependency2Group'
}
}
在上面的示例中,我们定义了一个名为dependencies
的依赖项列表。
编辑 - 如果需要提供,我们将从编译配置中排除依赖项。这意味着即使子项目添加了您希望作为编译提供的依赖项,也不会发生这种情况。