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