Gradle项目树

Posted 清箫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gradle项目树相关的知识,希望对你有一定的参考价值。

在多项目构建中,项目的结构用树结构表示。初始化阶段,settings.gradle负责创建一棵由一系列ProjectDescriptor组成的项目树,当这棵树组装完毕,接着Gradle就根据这棵由ProjectDescriptors组成的项目树再创建一个由一系列Project对象组成的项目树。

也就是说,在初始化阶段,我们在settings.gradle中操作的是ProjectDescriptor,而在配置和执行阶段,我们在build.gradle中操作的是Project。

准备

Settings.gradle的位置

默认情况下,settings.gradle文件和build.gradle文件的位置相同。

而在没有settings.gradle文件的项目中,如果执行构建,则Gradle按这个顺序查找settings.gradle:

  1. 从当前目录的master文件夹内寻找。
  2. 如果master目录中也没有,则搜索父目录。
  3. 如果父目录也没找到,则把构建当成单个项目构建。
  4. 如果找到了,并且发现当前项目是多项目构建的一部分,则执行多项目构建。没找到,则执行单项目构建。

从第二步中可以看出,Gradle支持从子项目中触发构建父项目。如果不想从子项目触发父项目,而只是做单项目构建,则应该在gradle命令后加上-u命令行选项。

项目位置

默认情况下,项目的路径和项目在文件系统中的目录位置是一致的,比如projectA:child对应的目录地址为projectA/child,除非在settings.gradle中被重新定义了。同时,项目路径默认都是相对路径。

根项目

在默认情况下,settings.gradle文件所在的目录就是根项目的位置,除非在settings.gradle中被重新定义。

根项目在settings.gradle和build.gradle中,都是通过rootProject引用。

项目树布局

Settings.gradle创建的项目树由一系列ProjectDescriptior组成,根项目的ProjectDescriptor在Gradle中的引用名称为rootProject。

Gradle在评估项目树的时候是从根节点往子节点按广度优先顺序(从上而下,同一层是从左至右)评估的。所以,项目树的布局,直接影响子项目的评估顺序(参考Gradle生命周期)。

子项目作为项目树叶子节点的加入方式有两种:分层布局或扁平布局。

分层布局

include'project1', 'project2:child', 'services:hotels:api'

因为项目路径默认等价于文件系统的相对地址,所以路径services:hotels:api默认对应的目录为:services/hotels/api。但需要注意的是在分层布局中,services:hotels:api等于创建了三个项目,即services,services:hotel和services:hotels:api。

分层布局适合用于子项目位于根项目目录之中的情况。

扁平布局

includeFlat'project3', 'project4'

扁平布局意味着子项目的目录位置和根项目的目录是平行结构,是兄弟关系。

扁平布局适合用于子项目目录和根项目目录平行的情况。

修改项目描述

前面的分层布局和扁平布局只是负责创建相应项目的ProjectDescriptor,如果你的子项目和默认的配置不同,比如文件位置,构建脚本位置都不在常规位置,则需要在include之后修改。

include ':projectA'
project(':projectA').projectDir= new File(settingsDir, '../my-project-a')
project(':projectA').buildFileName= 'projectA.gradle'

以上是关于Gradle项目树的主要内容,如果未能解决你的问题,请参考以下文章

Gradle项目树

[JSOI2016]独特的树叶

输出选定的决策树叶

怎样让真树叶保持在树枝

Luogu P4323 [JSOI2016]独特的树叶

分别统计二叉树中树叶和度为1的结点个数.