gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:06:40 25 4
gpt4 key购买 nike

我使用 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'

让我们制作项目 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 继承属性并且基本上不再是 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{ ... } .

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

    关于gradle - 如何在 Gradle 中创建可传递的分层多项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56879847/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com