将所有依赖项从一个Gradle模块导入另一个模块

时间:2013-10-15 23:16:31

标签: gradle android-gradle

我的构建中有两个模块,一个Android应用程序和一个Java库。 (旁边的故事,Java库是针对Android应用程序中的类运行jvm测试。由于它需要Gradle Java插件,而且与Gradle Android插件不兼容,我不得不拆分它们。)

在java模块中,我想自动导入另一个模块的所有依赖项,以避免它们保持同步。

如何配置一个模块的compileTest依赖项以匹配其他模块compile依赖项?

(使用这两个插件的替代建议欢迎。)

1 个答案:

答案 0 :(得分:3)

如果你写的话,你将在module2中获得module1的compile个依赖关系作为testCompile个依赖关系:

dependencies { 
    testCompile project(':module1') 
}

在module2的build.gradle文件中。正如您在评论中所述,如果未在module2中应用,则不会从module1中应用的android插件中获取依赖项。

编辑:添加了以下有关如何在单独脚本中定义依赖关系的说明。

如评论中所述,另一种方法是在单独的脚本中添加属性,该脚本定义每个第三方依赖项。我倾向于在我参与的每个多项目构建中执行此操作。实际上,由于我已经习惯了dependencies.gradle文件的存在,我实际上也在单项目构建中执行此操作。

这个想法很简单:

  • 添加一个单独的脚本,其中包含定义第三方依赖关系的属性
  • 在每个模块中应用此脚本
  • 使用属性而不是在任何地方重复硬编码

通过这种方式,您可以在一个地方定义所有依赖项,依赖项定义的可读性会增加,并且您的模块永远不会彼此“不同步”(例如,两个模块取决于同一个库的不同版本) 。另外一个好处是,您可以将属于一起的多个依赖项组合在一个属性中。

示例:

假设我们有问题中描述的2个模块。第1单元使用了一些第三方库。模块2应该测试模块1并且需要模块1中定义的每个库以及它自己的一些库。

<强> dependencies.gradle

ext {
    JAVAX_MAIL = 'javax.mail:mail:1.4.5'
    JODA_TIME = 'joda-time:joda-time:2.1'
    LOG4J = 'log4j:log4j:1.2.16'
    SPOCK = [
            'org.spockframework:spock-core:0.7-groovy-2.0',
            'org.objenesis:objenesis:1.2',
            'cglib:cglib-nodep:2.2.2'
    ]

    // Note: I don't usually combine dep's like this, it's just for illustration.
    //       I prefer to spell them out to make it more explicit.
    MODULE_1_DEPS = [ JAVAX_MAIL, LOG4J ]
}

<强> module1/build.gradle

apply from: "$rootDir/dependencies.gradle"

dependencies {
    compile MODULE_1_DEPS
}

<强> module2/build.gradle

apply from: "$rootDir/dependencies.gradle"

dependencies {
    compile JODA_TIME, LOG4J
    testCompile MODULE_1_DEPS, SPOCK
}

注意:如果您将属性“合并”到列表列表中,则可能必须展平列表。即类似于:MY_DEP = [ DEP1, DEP2 ].flatten()也许 gradle为你做了,老实说我不知道​​ - 我还没有测试过。

另请注意:此处的示例仅仅是关于如何实现您想要的内容的插图,但它们并不完整。