3

我的构建中有两个模块,一个 Android 应用程序和一个 Java 库。(顺便说一句,Java 库是针对 Android 应用程序中的类运行 jvm 测试。由于它需要 Gradle Java 插件并且与 Gradle Android 插件不兼容,因此我不得不将它们分开。)

在 java 模块中,我想自动导入其他模块的所有依赖项,以避免必须保持同步。

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

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

4

1 回答 1

3

如果您编写以下代码,您将获得compilemodule1 的依赖项作为module2 中的依赖项:testCompile

dependencies { 
    testCompile project(':module1') 
}

build.gradlemodule2的文件中。正如您自己在评论中所述,如果未在 module2 中应用,您将不会从在 module1 中应用的 android 插件获得依赖项。

编辑:添加了以下关于如何在单独的脚本中定义依赖项的描述。

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

这个想法很简单:

  • 添加一个单独的脚本,其中包含定义您的第 3 方依赖项的属性
  • 在每个模块中应用此脚本
  • 使用属性而不是到处重复的硬编码

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

例子:

假设我们有问题中描述的 2 个模块。模块 1 使用一些 3rd 方库。模块 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 为你做了,老实说我不知道​​——我还没有测试过。

另请注意:这里的示例只是说明如何实现您想要的,它们绝不是完整的。

于 2013-10-16T13:38:37.790 回答