如何在Gradle中创建可传递的层次化多项目?

时间:2019-07-04 02:17:23

标签: gradle build.gradle

我已经使用Gradle有一段时间了,但是从没有深入研究它的许多特性和功能,但是有一天,我决定将Java项目分成两个模块,以便于测试和维护。完成之后,我开始阅读有关Authoring Multi-projects和一个名为Composite builds的较新Gradle概念之一。然后,我花了大部分时间尝试应用(我认为我了解的)这种知识来使我的项目模块化。可以肯定地说我没有成功,现在我在这里寻求帮助来理解这些概念及其应用。

理论工作区

让我们想象一下,我们具有以下目录结构:

toolbox
|
├── first-tool
|   └── build.gradle
|
├── second-tool
|   └── build.gradle
|
├── build.gradle
└── settings.gradle

这些是根目录中的项目:

Root project 'toolbox'
+--- Project ':first-tool'
\--- Project ':second-tool'

我们的make项目first-tool引入了一个外部依赖项org.master-toolbox:some.other.tool,第二个工具箱依赖该外部依赖项,但自身不实现:

default - Configuration for default artifacts.
+--- org.master-toolbox:some.other.tool:1.0
|    +--- ...
\--- io.toolbox:first-tool

这些是相关的Gradle文件:

settings.gradle

rootProject.name = 'toolbox'

include 'first-tool', 'second-tool'

toolbox.build.gradle

allprojects {

    apply plugin: 'java-library'

    group = "io.toolbox"

    repositories {
        jcenter()
    }
} 

first-tool.build.gradle

dependencies {
    // This is an external dependency that is resolved through jcentral
    implements 'org.master-toolbox:some.other.tool:1.0'
}

second-tool.build.gradle

dependencies {
    // Try to implement first-tool build to inherit dependencies
    implementation 'io.toolbox:first-tool'
}

上面的代码产生了一个不错的项目结构,但是上面的代码却无法正常工作,因为second-tool找不到first-tool,并且在控制台中也会出现类似于以下错误的内容:

> Could not resolve all files for configuration ':second-tool:compileClasspath'.
   > Could not find io.toolbox:first-tool:.
     Required by:
         project :second-tool

现在,据我所知,这是复合构建应该通过允许我们包含整个构建来扑入并节省一天的地方。听起来不错,让我们更新一下settings.gradle

rootProject.name = 'toolbox'

includeBuild `first-tool`
include 'second-tool'

现在项目可以正确构建和编译,一切都很好,对吗?完全不完全正确,例如在我们的includeBuild中使用settings.gradle关键字,first-tool不再从toolbox继承属性,并且基本上不再是{{1 }}。

项目目标

我很可能会误解复合材料构建的整个概念,或者只是犯了愚蠢的错误。不管哪种方式,我想知道的是,是否有一种方法可以使子项目相互依赖,从而形成分层的多项目结构?

按现状,我必须在以下选项之间进行选择:

  • 常规的多项目构建,其中的所有内容都井井有条,井井有条,我的所有子项目都与顶层项目共享相同的定义。
  • 可以自由创建项目间依赖关系的复合构建。

如果有一个主toolbox驻留在顶层项目的根目录中,并定义整个层次结构的通用插件,存储库,组等,那将是很好的。然后,其他项目将拥有自己的build.gradle文件,这些文件将赋予它们唯一的属性,但将从顶部项目执行其任务。

我已经阅读了有关此主题的官方文档,因此我正在寻找有关如何实现此特定目标的更具体的解释和方向。

1 个答案:

答案 0 :(得分:1)

使用多模块构建时,一个模块可以依赖于另一个模块。要让第二个项目依赖于第一个项目,请将second-tool/build.gradle编辑为:

dependencies {
    implementation project(':first-tool')
}

另外,第一个模块应该是:

dependencies {
    api 'org.master-toolbox:some.other.tool:1.0'
}

您可以使用多模块构建来完成您描述的事情;您可以具有模块间的依存关系,并且可以使用allprojects { ... }subprojects{ ... }在顶层构建中配置模块。

很少使用复合构建-如果您对“整体”构建感到满意,并且不需要将代码拆分为不同的存储库。等,然后使用(普通的)多模块构建。