Gradle 多项目构建
-
- Gradle 多项目构建
- 目的
- 概要
- 创建步骤
- 1、创建一个根项目
- 2、添加一个Groovy子目录工程
- 3、添加一个java子目录工程
- 4、添加文档工程
- 5、重构通用构建代码
- 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,只留下如下内容:
打开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