天天看点

Gradle多项目构建

Gradle 多项目构建

    • Gradle 多项目构建
      • 目的
      • 概要
      • 创建步骤
        • 1、创建一个根项目
        • 2、添加一个Groovy子目录工程
        • 3、添加一个java子目录工程
        • 4、添加文档工程
        • 5、重构通用构建代码

目的

多项目构建有助于模块化。它允许一个人专注于一个大型项目的一个工作领域,而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,只留下如下内容:

打开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') ==  'Hello,  Gradlephant'     } }

最后在根目录下运行命令:./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 添加:

在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[ ]);         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( )         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

在/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

继续阅读