Gradle多项目构建

Gradle 多项目构建

目的

多项目构建有助于模块化。它允许一个人专注于一个大型项目的一个工作领域,而Gradle则负责项目其他部分的依赖关系。

概要

  • 通过组合多个子项目来创建模块化软件项目。
  • 让一个子项目消耗另一个子项目的工件。
  • 轻松使用多边形项目。
  • 在所有子项目中运行类似的命名任务。
  • 在特定子项目中运行任务而不更改为该子项目的文件夹。
  • 将常用的子项目设置重构到根项目中。
  • 从根项目中选择性地配置子项目。

创建步骤

1、创建一个根项目

如下命令创建:

$mkdir  creating-multi-project-builds
$cd creating-multi-project-builds
$gradle init


生成如下目录结构

creating-multi-project-builds/ 
|—.gradle/ 
|—gradle/ 
|—build.gradle 
|—gradlew 
|—gradlew.bat 
|—settings.gradle

创建成功,使用./gradlew(或gradlew.bat在Windows上)而不是gradle。然后打开settings.gradle,只留下如下内容:

rootProject.name = 'creating-multi-project-builds'

打开build.gradle并更换其内容:

allprojects {
    repositories {
        jcenter()
    }
}

在build.gradle中添加所有子模块版本号:

subprojects {
    version =  '1.0'
}
2、添加一个Groovy子目录工程

在根目录创建子目录:

mkdir greeting-library

在子目录下创建gradle配置文件build.gradle 
并添加如下内容:

apply plugin :  'groovy'
dependencies {
    compile  'org.codehaus.groovy:groovy:2.4.10'
    testCompile  'org.spockframework:spock-core:1.0-groovy-2.4', {
        exclude module :  'groovy-all'
    }
}

然后在根目录setings.gradle中添加如下类容:

include 'greeting-library'

最后在gradle-library中穿件如下目录:

$ mkdir - p src/main/groovy/greeter
$ mkdir - p src/test/groovy/greeter

在src/main/groovy/greeter 包下创建GreetingFormatter.groovy,并添加内容:

package greeter
import groovy.transform.CompileStatic
@CompileStatic
class GreetingFormatter {
    static  String greeting( final  String name) {
        "Hello, ${name.capitalize()}"
    }
}

在greeting-library/src/test/groovy/greeter创建 
GreetingFormatterSpec.groovy,添加内容如下:

package greeter
import spock.lang. Specification
class GreetingFormatterSpec extends Specification {
    def 'Creating a greeting'() {
        expect:  'The greeting to be correctly capitalized'
        GreetingFormatter.greeting( 'gradlephant') ==  'HelloGradlephant'
    }
}

最后在根目录下运行命令:./gradlew

$ ./gradlew build
:greeting-library:compileJava NO-SOURCE
:greeting-library:compileGroovy
:greeting-library:processResources NO-SOURCE
:greeting-library:classes
:greeting-library:jar
:greeting-library:assemble
:greeting-library:compileTestJava NO-SOURCE
:greeting-library:compileTestGroovy
:greeting-library:processTestResources NO-SOURCE
:greeting-library:testClasses
:greeting-library:test
:greeting-library:check
:greeting-library:build
BUILD SUCCESSFUL in 15s
4 actionable tasks: 4 executed

3、添加一个java子目录工程

在根目录下创建一个greeter文件夹

mkdir greeter

并在greeter中创建build.gradle,添加如下内容:

apply  plugin :  'java'
apply  plugin :  'application'

在根目录下的settings.gradle 添加:

include 'greeter'

在greeter中创建如下目录

$ mkdir -p greeter/src/main/java/greeter

并在greeter/src/main/java/greeter下创建Greeter.java

package greeter;
public  class Greeter {
    public static void main(String[] args) {
        final String output = GreetingFormatter.greeting(args[ 0]);
        System.out.println(output);
    }
}

在greeter子目录中创建build.gradle,并添加如下内容:

mainClassName =  'greeter.Greeter'
dependencies {
    compile  project( ':greeting-library')
}

最后运行如下:

$ ./gradlew build
:greeting-library:compileJava NO-SOURCE
:greeting-library:compileGroovy UP-TO-DATE
:greeting-library:processResources NO-SOURCE
:greeting-library:classes UP-TO-DATE
:greeting-library:jar UP-TO-DATE
:greeter:compileJava
:greeter:compileGroovy NO-SOURCE
:greeter:processResources NO-SOURCE
:greeter:classes
:greeter:jar
:greeter:startScripts
:greeter:distTar
:greeter:distZip
:greeter:assemble
:greeter:compileTestJava NO-SOURCE
:greeter:compileTestGroovy
:greeter:processTestResources NO-SOURCE
:greeter:testClasses
:greeter:test
:greeter:check
:greeter:build
:greeting-library:assemble UP-TO-DATE
:greeting-library:compileTestJava NO-SOURCE
:greeting-library:compileTestGroovy UP-TO-DATE
:greeting-library:processTestResources NO-SOURCE
:greeting-library:testClasses UP-TO-DATE
:greeting-library:test UP-TO-DATE
:greeting-library:check UP-TO-DATE
:greeting-library:build UP-TO-DATE
BUILD SUCCESSFUL in 5s
11 actionable tasks: 7 executed, 4 up-to-date

在greeter/build.gradle下添加

apply plugin :  'groovy'
// then, add the following testCompile dependency to the dependencies block:
dependencies {
    testCompile  'org.spockframework:spock-core:1.0-groovy-2.4', {
        exclude module :  'groovy-all'
    }
}

在greeter下创建src/test/groovy/greeter目录

mkdir -p src/test/groovy/greeter

在src/test/groovy/greeter创建GreeterSpec.groovy文件,添加如下代码:

package greeter
import spock.lang. Specification
class GreeterSpec extends Specification {
    def 'Calling the entry point'() {
        setup:  'Re-route standard out'
        def buf new  ByteArrayOutputStream( 1024)
        System.out =  new  PrintStream(buf)
        when:  'The entrypoint is executed'
        Greeter.main( 'gradlephant')
        then:  'The correct greeting is output'
        buf.toString() ==  "Hello, Gradlephant\n"
    }
}

在根目录下运行./gradlew :greeter:test

$ ./gradlew :greeter:test
:greeting-library:compileJava NO-SOURCE
:greeting-library:compileGroovy UP-TO-DATE
:greeting-library:processResources NO-SOURCE
:greeting-library:classes UP-TO-DATE
:greeting-library:jar UP-TO-DATE
:greeter:compileJava UP-TO-DATE
:greeter:compileGroovy NO-SOURCE
:greeter:processResources NO-SOURCE
:greeter:classes UP-TO-DATE
:greeter:compileTestJava NO-SOURCE
:greeter:compileTestGroovy UP-TO-DATE
:greeter:processTestResources NO-SOURCE
:greeter:testClasses UP-TO-DATE
:greeter:test UP-TO-DATE
BUILD SUCCESSFUL in 0s
5 actionable tasks: 5 up-to-date
4、添加文档工程

为软件项目创建文档被认为是很好的做法。虽然有许多方法可以实现此目标,但您将使用非常流行的Asciidoctor工具。 
在根目录build.gradle 文件最顶部添加如下:

plugins {
    id  'org.asciidoctor.convert' version  '1.5.6' apply  false
}

然后在根目录下创建docs子项目

mkdir docs

在docs下创建build.gradle 并添加如下内容:

apply plugin :  'org.asciidoctor.convert'
asciidoctor {
    sources {
        include  'greeter.adoc'
    }
}
build.dependsOn  'asciidoctor'

然后在docs下创建src/docs/asciidoc目录

mkdir -p src/docs/asciidoc

将docs目录添加到settings.gradle

include 'docs'

在/docs/src/docs/asciidoc下创建greeter.adoc文件 
添加如下内容

= Greeter命令行应用程序
一个简单的应用程序,演示Gradle多项目的灵活性。
==安装
将ZIP或TAR文件解压到合适的位置
==用法
[清单]
----
$ cd greeter-1.0
$ ./bin/greeter gradlephant
你好,Gradlephant
----

运行./gradlew asciidoctor

./gradlew asciidoctor

在greeter的build.gradle 文件中添加如下代码:

distZip {
    from project( ':docs').asciidoctor, {
        into  "${project.name}-${version}"
    }
}
distTar {
    from project( ':docs').asciidoctor, {
        into  "${project.name}-${version}"
    }
}

然后运行:

./gradlew build
5、重构通用构建代码

在根目录build.gradle 文件中添加如下代码:

configure( subprojects. findAll {it.name ==  'greeter' || it.name ==  'greeting-library'} ) {
    apply plugin :  'groovy'
    dependencies {
        testCompile  'org.spockframework:spock-core:1.0-groovy-2.4', {
            exclude module :  'groovy-all'
        }
    }
}

删除greeting-library/build.gradle和greeter/build.gradle中的如下代码

apply plugin :  'groovy'
dependencies {
    testCompile  'org.spockframework:spock-core:1.0-groovy-2.4', {
        exclude module :  'groovy-all'
    }
}

重新运行顶层的gradle以确保它仍然可以正常工作:

./gradlew clean build

$mkdir creating-multi-project-builds
$cd creating-multi-project-builds
$gradle init
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值