【问题标题】:Selective dependencies in GradleGradle 中的选择性依赖
【发布时间】: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


    【解决方案1】:
    ext{
        dependencies = [
                        "dependencyGroup:dependencyName:dependencyVersion",
                        "dependency2Group:dependency2Name:dependency2Version"
        ]
    }
    
    subprojects{
        dependencies {
            provided dependencies
        }
        configurations {
            compile.exclude group: 'dependencyGroup'
            compile.exclude group: 'dependency2Group'
        }
    }
    

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

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

    【讨论】:

    • 我不确定我是否理解;也许我的问题不清楚。应该提供的不是我的子项目,而是第三方库(例如 log4j)。
    • @jqno 对不起,如果我不清楚。我在代码示例下方添加了解释。希望这能让它更清楚。让我知道任何问题。
    • 谢谢!我现在知道了。不过,这并不是我的问题的真正答案:我的问题适用于 all 子项目,以及所有依赖项的子集。我会更新我的问题以澄清。
    • 什么定义了子项目是否应该将它们作为编译或提供的依赖项?
    • 我认为这句话可能存在误解(我不清楚):“我希望有一个配置,其行为与为特定依赖项列表提供的行为一样,并且为所有其他人。”
    猜你喜欢
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2022-08-16
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多