Gradle中的选择性依赖项

时间:2014-12-08 12:48:11

标签: gradle dependency-management

我正在设置一个多项目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 }
        }
    }
}

请告诉我如何才能完成这项工作,或者是否有更好的方式来实现我想要的目标。


编辑为清晰起见,部分重写

1 个答案:

答案 0 :(得分:1)

ext{
    dependencies = [
                    "dependencyGroup:dependencyName:dependencyVersion",
                    "dependency2Group:dependency2Name:dependency2Version"
    ]
}

subprojects{
    dependencies {
        provided dependencies
    }
    configurations {
        compile.exclude group: 'dependencyGroup'
        compile.exclude group: 'dependency2Group'
    }
}

在上面的示例中,我们定义了一个名为dependencies的依赖项列表。

编辑 - 如果需要提供,我们将从编译配置中排除依赖项。这意味着即使子项目添加了您希望作为编译提供的依赖项,也不会发生这种情况。