我的构建中有两个模块,一个Android应用程序和一个Java库。 (旁边的故事,Java库是针对Android应用程序中的类运行jvm测试。由于它需要Gradle Java插件,而且与Gradle Android插件不兼容,我不得不拆分它们。)
在java模块中,我想自动导入另一个模块的所有依赖项,以避免它们保持同步。
如何配置一个模块的compileTest
依赖项以匹配其他模块compile
依赖项?
(使用这两个插件的替代建议欢迎。)
答案 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为你做了,老实说我不知道 - 我还没有测试过。
另请注意:此处的示例仅仅是关于如何实现您想要的内容的插图,但它们并不完整。