Gradle(四)多项目构建

938 阅读2分钟

Gradle 执行多项目构建

一般的小项目只有一个 build.gradle 文件和一个sourse tree,但是当项目规模大了之后,单模块渐渐不能满足工程师的需求。如果一个大项目被分割成更小的、相互依赖的多个子模块,那么通常会架构更清晰,更易读,这个过程实际上就是通俗意义上的“模块化”。“相互依赖”这个词很重要,这也是为什么我们通常想要通过单个构建将各个子模块链接在一起的原因。

Gradle 通过 多项目构建 来支持上述这种场景,需要注意的是 多项目构建 实际上还是一个 Gradle 项目支持(single software component )

与之对应的还有另一种方法,那就是将一个大规模的软件项目分为多个组件,每一个组件都由单一的 Gradle 构建来表示,本章主要介绍的是 Gradle 的多项目构建

创建 Gradle 多项目构建(multi-project build)

一个多项目的Gradle 构建由一个根项目(root proejct)和若干个 子项目(sub-proejct)构成。

最基本的多项目构建只包含一个根项目和一个子项目。下面是一个多项目构建的结构,其中包含一个名为app的子项目:

//Project layout
.
├── app
│   ...
│   └── build.gradle
└── settings.gradle

上面的结构就是官方推荐的Gradle 项目结构。
build init plugin 插件会生成遵循这个结构框架的项目

note: root project 没有 build.gradle 文件,只有 setttings.gradle 文件,这个文件用于配置哪些子项目参与构建

// settings.gradle.kts
rootProject.name = "basic-multiproject"
include("app")

在上面这个例子中,在构建时,gradle 就会在 app 目录去寻找 build.gradle 文件来执行。

我们可以通过运行gradle projects命令来查看多项目构建的结构。

> gradle -q projects

------------------------------------------------------------
Root project 'basic-multiproject'
------------------------------------------------------------

Root project 'basic-multiproject'
\--- Project ':app'

To see a list of the tasks of a project, run gradle <project-path>:tasks
For example, try running gradle :app:tasks

假设 app 子项目是一个Java应用程序,通过 application 插件和配置主类:

// app/build.gradle.kts
plugins {
    id("application")
}

application {
    mainClass.set("com.example.Hello")
}
// app/src/main/java/com/example/Hello.java
package com.example;

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

我们可以运行这个主函数:

> gradle -q run
Hello, world!

添加子项目

现在我们想向项目添加一个名为 ‘lib’ 的子项目,我们需要在 setting.gradle 文件中添加一行 include

// settings.gradle.kts
rootProject.name = "basic-multiproject"
include("app")
include("lib")

gradle 在构建时就会在 lib 文件夹内去寻找 build 文件去执行

// Project layout
.
├── app
│   ...
│   └── build.gradle.kts
├── lib
│   ...
│   └── build.gradle.kts
└── settings.gradle.kts