我的构建中有两个模块,一个 Android 应用程序和一个 Java 库。(顺便说一句,Java 库是针对 Android 应用程序中的类运行 jvm 测试。由于它需要 Gradle Java 插件并且与 Gradle Android 插件不兼容,因此我不得不将它们分开。)
在 java 模块中,我想自动导入其他模块的所有依赖项,以避免必须保持同步。
如何配置一个模块的compileTest
依赖项以匹配另一个模块的compile
依赖项?
(欢迎使用这两个插件的替代建议。)
我的构建中有两个模块,一个 Android 应用程序和一个 Java 库。(顺便说一句,Java 库是针对 Android 应用程序中的类运行 jvm 测试。由于它需要 Gradle Java 插件并且与 Gradle Android 插件不兼容,因此我不得不将它们分开。)
在 java 模块中,我想自动导入其他模块的所有依赖项,以避免必须保持同步。
如何配置一个模块的compileTest
依赖项以匹配另一个模块的compile
依赖项?
(欢迎使用这两个插件的替代建议。)
如果您编写以下代码,您将获得compile
module1 的依赖项作为module2 中的依赖项:testCompile
dependencies {
testCompile project(':module1')
}
在build.gradle
module2的文件中。正如您自己在评论中所述,如果未在 module2 中应用,您将不会从在 module1 中应用的 android 插件获得依赖项。
编辑:添加了以下关于如何在单独的脚本中定义依赖项的描述。
如评论中所述,另一种方法是在定义每个第 3 方依赖项的单独脚本中添加属性。我倾向于在我参与的每个多项目构建中执行此操作。实际上,由于我已经习惯了dependencies.gradle
文件的存在,我实际上也在单项目构建中执行此操作。
这个想法很简单:
这样,您将所有依赖项定义在一个地方,增加了依赖项定义的可读性,并且您的模块永远不会彼此“不同步”(例如,两个模块取决于同一库的不同版本)。一个额外的好处是您可以将属于一个属性的多个依赖项组合在一起。
例子:
假设我们有问题中描述的 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 为你做了,老实说我不知道——我还没有测试过。
另请注意:这里的示例只是说明如何实现您想要的,它们绝不是完整的。