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') == '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 添加:

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

英文原文 

猜你喜欢

转载自blog.csdn.net/u011051190/article/details/80003518