第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-utilsstring-utilsmy-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也提供了直接导入组合构建的功能。

导入组合构建,可以实现各个工程同时独立开发,有可以使用配置将他们联系在一起。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 朋友打麻将我在楼上 下厨房里边做菜边啪 相隔不到5公尺偷捅妻子朋友 相隔不到5公尺偷吊妻子朋友 好朋友的妻子 偷朋友的妻子中手机观看 浮荡的妻子韩国漫画电影 住在朋友家里偷他妻子故事 韩国互换朋友妻子中文字幕 偷朋友的妻子2电影 我的两个妻子韩国中文字幕 妻子的通d2在线播放 妻子怀了朋友父亲的孩子 偷朋友妻子3 韩国电影交互妻子中文字幕 乖妻子出国 兽父d女儿 真实操朋友妻子 大军瓜棚偷d二婶 玩弄朋友的妻子中文字幕 别人d污妻子如何用法律 偷朋友的妻子 mp4 偷朋友的妻子5 偷朋友老婆瑜伽 去别人家睡他老婆 呼唤朋友的妻子中字 偷吃朋友妻子电影 邻居妻子3中文字 妻子没关门被人白白玩中文字 我妻子的朋友中文字 兄弟的妻子手机 中文字 我的妻子bd在线 在职妻子bd高清 邻居家的妻子bd 我妻子的姐3bd高清中文 妻子的朋友在线中文字bd 正在bd播放 妻子2 妻子与水电工在线bd播放 妻子的朋友4bd 91三个兄弟专搞朋友 朋友的妻子3中文字幕 寂寞的妻子手机在线中文字幕