第7章 组合构建
来源:互联网 发布:淘宝网如何运营 编辑:程序博客网 时间:2024/06/01 19:37
组合构建是孵化阶段的特性,在一些场景下非常有用,但是也发现了一些Bug和需要改进的地方,会在将来进行优化。
7.1. 什么是组合构建(composite build)
组合构建是一个包含多个构建的简单构建。它的许多方面与多工程项目构建(multi-project)相似,但它构建的是多个项目,而非单一项目。
使用组合构建你可以:
- 组合构建单独开发的项目,例如要调试工程依赖包中的bug
- 将一个大型的多工程项目拆解成相对独立的工程,可以组合使用也可以被其他项目依赖
如果一个构建(build)包含在了组合构建(composite build)中,很自然的被成为“被包含构建(included build)”。被包含构建不会共享自己的配置信息给其他被包含构建,也不会共享其他构建的配置信息。每个被包含构建都是隔离的。
被包含构建之间的交互通过依赖替换(dependency substitution
)实现。如果某构建的依赖存在与被包含构建中,该依赖会替换为工程依赖。
默认情况下Gradle会自动识别可替换成工程依赖的外部依赖。但是一些复杂的场景,Gradle可能会判断出错,需要自己配置工程替换。详情参考(“Declaring the dependencies substituted by an included build”)
组合构建中的任务,不仅可以依赖工程的输出,也可以依赖被包含构建内的任务。但是被包含任务不能依赖其他被包含构建。详情见Depending on tasks in an included build
7.2. 定义组合构建
下面的例子展示了两种单独开发的构建组合成一个组合构建。例如my-utils
是一个多工程项目,它包含两个子工程number-utils
和string-utils
。my-app
姓名是一个可执行的jar包项目。
my-app
项目没有直接引用my-utils
项目,而是引用了它生成的jar包。
示例 7.1. my-app的引用
my-app/build.gradle
apply plugin: 'java'apply plugin: 'application'apply plugin: 'idea'group "org.sample"version "1.0"mainClassName = "org.sample.myapp.Main"dependencies { compile "org.sample:number-utils:1.0" compile "org.sample:string-utils:1.0"}repositories { jcenter()}
注意:示例中的代码在完整Gradle发布包的samples/compositeBuilds/basic路径下
7.2.1 使用--include-build
定义组合构建
使用--include-build
命令行参数将构建转成组合构建。
示例 7.2. 命令行组合构建
gradle --include-build ../my-utils run
输出:
:processResources NO-SOURCE:my-utils:string-utils:compileJava:my-utils:string-utils:processResources NO-SOURCE:my-utils:string-utils:classes:my-utils:string-utils:jar:my-utils:number-utils:compileJava:my-utils:number-utils:processResources NO-SOURCE:my-utils:number-utils:classes:my-utils:number-utils:jar:compileJava:classes:runThe answer is 42BUILD SUCCESSFUL in 0s2 actionable tasks: 2 executed
7.2.2. settings.gradle
中定义组合构建
在settings.gradle
文件中通过Settings.includeBuild(java.lang.Object)
也可以实现上述效果。settings.gradle
能够同时配置子工程和被包含构建,下面的例子介绍了详细信息。
7.2.3. 定义独立的组合构建
上面的方式有一个缺陷就是要修改现有的构建,这对独立构建意义并不大。一种解决方案就是单独定义一个组合构建,它的目的只是联合其他独立的构建。
示例 7.3. 定义单独的组合构建
settings.gradle
rootProject.name='adhoc'includeBuild '../my-app'includeBuild '../my-utils'
这种情况下my-app
会被构建,但是不会执行main函数(my-app
中没有定义执行自己的任务)。为了执行main函数,需要定义一个代理任务。
示例 7.4. 依赖被包含构建中的任务
build.gradle
task run { dependsOn gradle.includedBuild('my-app').task(':run')}
7.2.4. 对被包含构建的约束
大多数构建都可以包含进组合构建,但也有一些约束条件:
- 必须有
settings.gradle
文件 - 自己不能是组合构建
- 多个被包含构建的
rootProject.name
不能重复 - 被包含构建的
rootProject.name
不能与组合构建最高级(top-leve)工程相同 - 被包含构建的
rootProject.name
不能与组合构建相同
7.3. 组合构建的交互
与组合构建的交互类似普通多工程项目构建。任何可以被执行、可以执行测试,也可以到导入至IDE。
7.3.1. 执行任务
任务可以通过命令行执行也可以使用IDE执行。任务的执行会引发被依赖任务的执行,包括被包含构建中的被依赖的任务。
注意:命令行中无法直接执行被包含构建中的任务,但是可以通过间接依赖或定义代理函数来执行。
7.3.2 导入IDE
将组合构建导入IDE是非常有用的,通过配置idea或eclipse插件,可以将构建导入IDEA或Eclipse内,这样就允许所有的开发一起进行。
新版本的ItelliJ IDEA和Eclipse Buildship也提供了直接导入组合构建的功能。
导入组合构建,可以实现各个工程同时独立开发,有可以使用配置将他们联系在一起。