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中添加如下类容:
扫描二维码关注公众号,回复:
33929 查看本文章
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'
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
英文原文
完