建.如何在 Gradle 中创建传递的分层多项目?



我已经使用 Gradle 一段时间了,但从未深入研究过它的许多特性和功能,但前几天我决定将我的 Java 项目分成两个模块,以便于测试和维护。完成后,我开始阅读有关创作多项目和一个名为复合构建的较新的 Gradle 概念。然后,我花了一天中的大部分时间试图应用(我认为我所理解的)这些知识来使我的项目模块化。可以肯定的是,我没有成功,现在我在这里寻求帮助来理解这些概念及其应用。

理论工作空间

让我们假设我们有以下目录结构:

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

这些是根目录中的项目:

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

让我们让项目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'

工具箱.构建.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'

现在项目构建和编译正确,一切都很好吧?不完全是,因为在settings.gradlefirst-tool中使用includeBuild关键字不再继承toolbox的属性,并且基本上不再是toolbox的子项目。

项目目标

我很可能误解了复合构建的整个概念,或者只是犯了愚蠢的错误。无论哪种方式,我想知道的是,是否有任何方法可以拥有一个分层的多项目结构,其中子项目相互依赖?

就目前而言,我必须在以下选项之间进行选择:

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

如果可以拥有一个驻留在顶级项目的根目录中的主build.gradle,并为整个层次结构定义通用插件、存储库、组等,那就太好了。然后,其他项目将拥有自己的build.gradle文件,这些文件将为其提供唯一的属性,但将从顶部项目执行其任务。

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

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

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

此外,第一个模块可能应该是:

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

您可以使用多模块构建来执行所描述的操作;您可以具有模块间的依赖关系,并且可以使用allprojects { ... }subprojects{ ... }从顶级构建配置模块。

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

最新更新