转载请注明出处http://blog.csdn.net/lastsweetop/article/details/78875987
只有一个的构建文件和资源层级的通常是很小的项目,很少有一个超大而且还是不可分割的项目。把一个项目拆分成几个相互依赖的小项目更容易有助于理解,相互依赖很重要,可以通过一次构建过程把多个项目构建起来。在Gradle中,这叫做多项目构建。
多项目构建的结构
多项目构建的结构可以能有多种多样的层次结构和大小,但是他们有一些共同点:
- 在项目的root或者master目录下有个
settings.gradle
文件 - 在项目的root或者master目录下有个
build.gradle
文件 - 子目录有各自的
*.gradle
文件(有些项目可能直接忽略子项目的构建脚本)
build.gradle
告诉Gradle根项目和子项目是如何组织的,你并不需要读这个文件才能了解这些。你仅仅需要执行gradle projects
命令,输出如下:
------------------------------------------------------------
Root project
------------------------------------------------------------
Root project 'studygradle'
+--- Project ':subdir' - this is a subproject
\--- Project ':tools'
+--- Project ':tools:client'
\--- Project ':tools:server'
To see a list of the tasks of a project, run gradle <project-path>:tasks
For example, try running gradle :subdir:tasks
输出指明了这个多项目有两个子项目subdir和tools,tools子项目又有它自己的子项目client和server,这些可以映射到文件系统的目录结构,很容易找到client在文件夹studygradle/tools/client。
默认情况下,Gradle会以在settings.gradle
找到的目录的文件名作为子项目的项目名。同一个项目组的所有开发者check out
的都是同样的目录,大多数情况下不会出什么问题。但是在持续集成环境中,比如Jenkins这些目录可能是自动生成的并不会和版本控制服务器的目录一致。这种情况下,你应该设置root工程的名字,即使是单个项目。可以在settings.gradle
文章中设置:
rootProject.name='studygradle'
通常每个项目都有它自己的构建文件,但是事实上也并非如此,比如tools子项目仅仅是其他连个子项目的容器,并不需要构建文件,在它对应的目录中并没有构建文件,但是root项目最好有自己的构建文件。
root项目的构建文件通常用于配置一些在子项目中有共性的配置,比如为所以子项目配置共用的插件和依赖。root的构建文件还可以配置单独的子项目,因为有些配置全部集中在一起可能更容易管理。
有时候构建文件名称并不一定是build.gradle
,这就需要在settings.gradle
中配置:
project(':tools:client').buildFileName='client.gradle'
多项目构建
从用户的视角来看,多项目构建就是一组需要执行的任务集合,不同的一点就是你需要控制去执行哪个项目的任务,这有两个方法:
- 进入相应的目录,执行
gradle <task>
命令 - 在随意一个目录执行限定的任务名,同城都是root目录中,比如
gradle :tools:client:build
将会执行子项目tools的子项目client的构建任务。
第一种方法和单一项目非常类似,但是多项目下,机制确是不同的,在相应项目中执行任务,将会执行对应子项目名称相同的任务,比如在root目录中执行gradle test
,那么所有的子项目也都会执行test任务,如果在tools目录下执行gradle test
,那么tools的子项目也都会执行test任务
为了更好的控制任务的执行范围,建议最好使用第二种方法,限定名称第一个:
表示根路径,其他的:
表示分隔符,类似于文件的分隔符,这种方法可以让构建非常灵活有效。
无论哪种构建,一个项目被构建,那么它依赖的其他项目也必定被构建,你不需要担心这些,你只需要配置项目的依赖关系即可。