代码之家  ›  专栏  ›  技术社区  ›  Turnsole

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

  •  3
  • Turnsole  · 技术社区  · 12 年前

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

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

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

    (欢迎使用这两个插件的其他建议。)

    1 回复  |  直到 12 年前
        1
  •  3
  •   Steinar    12 年前

    你会得到 compile 模块1的依赖项为 testCompile 模块2中的依赖项,如果您编写:

    dependencies { 
        testCompile project(':module1') 
    }
    

    build.gradle 模块2的文件。正如你自己在评论中所说,如果在module2中没有应用,你就不会从module1中应用的android插件中获得依赖关系。

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

    如注释中所述,另一种方法是在定义每个第三方依赖项的单独脚本中添加财产。我倾向于在我参与的每一个多项目构建中都这样做。事实上,由于我已经习惯了 dependencies.gradle 文件中,我实际上也在单个项目构建中这样做。

    这个想法很简单:

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

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

    例子:

    假设我们有两个模块,如问题中所述。模块1使用了一些第三方库。模块2应该测试模块1,并且除了它自己的一些库之外,还需要模块1中定义的每个库。

    依赖性等级

    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是为你做的,我真的不知道——我还没有测试过。

    还要注意:这里的例子只是关于如何实现你想要的东西的说明,它们在任何方面都不完整。