关于Java:何时使用gradle.properties和settings.gradle?

When to use gradle.properties vs. settings.gradle?

Gradle构建有三个文件

  • build.gradle定义构建配置脚本
  • gradle.properties
  • settings.gradle

问题

  • settings.gradlegradle.properties之间有什么区别?
  • 什么时候应该在settings.gradle
    gradle.properties

settings.gradle

settings.gradle文件是Groovy脚本,就像build.gradle文件一样。每个构建中将只执行一个settings.gradle脚本(与多项目构建中的多个build.gradle脚本相比)。 settings.gradle脚本将在任何build.gradle脚本之前甚至在创建Project实例之前执行。因此,将根据Settings对象对其进行评估。使用此Settings对象,您可以将子项目添加到构建中,从命令行(StartParameter)修改参数,并访问Gradle对象以注册生命周期处理程序。因此,如果您的设置与构建相关,而不一定与项目相关,或者在包含可能的子项目之前需要逻辑,则使用settings.gradle

gradle.properties

gradle.properties文件是一个简单的Java Properties文件,仅通过自动包含在Project对象的范围内(即所谓的"项目属性"),才能发挥特殊作用。这是一个简单的键值存储,仅允许使用字符串值(因此,您需要自己分割列表或数组)。您可以将gradle.properties文件放在以下位置:

  • 直接在项目目录中(用于与项目相关的值)
  • 在用户主目录.gradle目录中(用于与用户或环境相关的值)

一个多模块项目具有一个主模块和许多子模块。它具有以下布局:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(root)
  +- settings.gradle      
  +- build.gradle          # optional (commonly present)
  +- gradle.properties     # optional
  +-- buildSrc/            # optional
  |     +- build.gradle    
  |     +-- src/...
  +-- my-gradle-stuff/     # optional
  |     +- utils.gradle    # optional
  +-- sub-a/
  |     +- build.gradle
  |     +- src/
  +-- sub-b/
        +- build.gradle
        +- src/

子模块也可以位于子文件夹的更深处,但是在不修改settings.gradle中的代码的情况下,它们的名称将包括此类文件夹的名称。

settings.gradle

settings.gradle的主要作用是定义所有包含的子模块并标记模块树的目录根,因此在多模块项目中只能有一个settings.gradle文件。

1
2
3
rootProject.name = 'project-x'

include 'sub-a', 'sub-b'

设置文件也以groovy编写,并且可以自定义子模块查找。

build.gradle

每个模块有一个这样的文件,它包含此模块的构建逻辑。

在主模块的build.gradle文件中,可以使用allprojects {}subprojects {}定义所有其他模块的设置。

在子模块的build.gradle文件中,可以使用compile project(':sub-a')使一个子模块依赖于另一个。

gradle.properties

这是可选的,其主要目的是提供用于运行gradle本身的启动选项,例如

1
2
org.gradle.jvmargs=-Xmx=... -Dfile.encoding=UTF-8 ...
org.gradle.configureondemand=true

这些值可由文件USER_HOME/.gradle/gradle.properties覆盖,并由gradle命令行参数覆盖。也可以使用systemProp.作为前缀在此文件中为构建设置环境变量。

此文件中的任何属性都可以在任何build.gradle中使用,因此某些项目还将依赖项版本或发布信息放在gradle.properties中,但这可能是对该文件的滥用。

my-gradle-stuff / utils.gradle

(可以使用任何文件夹或文件名。)
您可以定义其他自定义gradle文件以重用定义,并通过以下方式将其包含在其他gradle文件中

1
apply from:"$rootDir/gradle/utils.gradle"

其他放置位置可能是src/gradlesrc/build/gradle

buildSrc / ...

此文件夹很特殊,它本身就像一个单独的gradle项目。它是在执行其他任何操作之前构建的,并且可以提供在任何其他gradle文件中使用的功能。由于技术原因,IDE对此文件夹的引用支持比将其他build.gradle文件中的通用代码提取到单独位置的任何其他方法要好得多。

您可以使用Java,Groovy或Kotlin定义复杂的自定义构建逻辑,而不必编写和部署插件。这对于单元测试自定义构建代码也很有用,因为您可以进行单元测试。 buildSrc中的源文件夹结构可以像任何java / groovy / kotlin项目一样进行修改。