Gradle - 構建指令碼
Gradle 構建一個指令碼檔案來處理兩件事;一個是專案,另一個是任務。每個 Gradle 構建都代表一個或多個專案。
一個專案代表一個庫 JAR 或一個 web 應用程式,或者它可能代表一個從其他專案生成的 JAR 檔案組裝而成的 ZIP 檔案。簡單來說,一個專案是由不同的任務組成的。
任務意味著構建執行的一項工作。一項任務可能是編譯一些類、建立 JAR、生成 Javadoc 或將一些存檔釋出到儲存庫。
Gradle 使用 Groovy 語言編寫指令碼。
編寫構建指令碼
Gradle 提供了一種領域特定語言 (DSL),用於描述構建。這使用 Groovy 語言來更容易地描述構建。Gradle 的每個構建指令碼都使用 UTF-8 編碼,離線儲存並命名為 build.gradle。
build.gradle
我們使用 Groovy 指令碼描述任務和專案。您可以使用 Gradle 命令執行 Gradle 構建。此命令查詢名為build.gradle的檔案。
讓我們來看下面的例子,它代表一個列印tutorialspoint的小指令碼。
將以下指令碼複製並儲存到名為build.gradle的檔案中。此構建指令碼定義了一個名為 hello 的任務,用於列印 tutorialspoint 字串。
task hello {
doLast {
println 'tutorialspoint'
}
}
在儲存 build.gradle 檔案的命令提示符中執行以下命令。
C:\> gradle –q hello
輸出
您將看到以下輸出:
tutorialspoint
如果您認為任務的工作方式類似於ANT 的目標,那麼這是正確的。Gradle 任務相當於 ANT 目標。
您可以透過為doLast語句指定一個快捷方式(表示符號<<)來簡化此 hello 任務。如果您將此快捷方式新增到上面的任務hello,它將看起來像下面的指令碼:
task hello << {
println 'tutorialspoint'
}
現在,您可以使用gradle –q hello命令執行上述指令碼。
Grade 指令碼主要使用兩個實際物件,一個是 Project 物件,另一個是 Script 物件。
Project 物件 - 每個指令碼都描述一個或多個專案。在執行過程中,此指令碼配置 Project 物件。您可以在構建指令碼中執行某些方法並使用屬性,這些方法和屬性委託給 Project 物件。
Script 物件 - Gradle 將指令碼程式碼轉換為實現 Script 介面的類,然後執行它。這意味著指令碼介面宣告的所有屬性和方法都在您的指令碼中可用。
下表定義了標準專案屬性的列表。所有這些屬性都在您的構建指令碼中可用。
| 序號 | 名稱 | 型別 | 預設值 |
|---|---|---|---|
| 1 | project | Project | Project 例項 |
| 2 | name | String | 專案目錄的名稱。 |
| 3 | path | String | 專案的絕對路徑。 |
| 4 | description | String | 專案的描述。 |
| 5 | projectDir | File | 包含構建指令碼的目錄。 |
| 6 | buildDir | File | projectDir/build |
| 7 | group | Object | 未指定 |
| 8 | version | Object | 未指定 |
| 9 | ant | AntBuilder | AntBuilder 例項 |
Groovy 基礎
Gradle 構建指令碼使用完整的 Groovy API。
作為入門,讓我們來看下面的例子。
示例 1
此示例說明如何將字串轉換為大寫。
將下面給出的程式碼複製並儲存到build.gradle檔案中。
task upper << {
String expString = 'TUTORIALS point'
println "Original: " + expString
println "Upper case: " + expString.toUpperCase()
}
在命令提示符中執行以下命令。它執行上面給出的指令碼。您應該在儲存 build.gradle 檔案的位置執行此操作。
C:\> gradle –q upper
輸出
Original: TUTORIALS point Upper case: TUTORIALS POINT
示例 2
以下示例說明列印隱式引數 ($it) 的值 4 次
將以下程式碼複製並儲存到build.gradle檔案中。
task count << {
4.times {
print "$it "
}
}
在命令提示符中執行以下命令。它執行上面提到的指令碼。您應該在儲存 build.gradle 檔案的位置執行此操作。
$ gradle –q count
輸出
這將產生以下輸出:
0 1 2 3
Groovy 的特性
Groovy 語言提供了許多特性。下面討論一些重要的特性:
Groovy JDK 方法
Groovy 向標準 Java 類添加了許多有用的方法。例如,JDK 中的 Iterable API 實現了一個each()方法,該方法迭代 Iterable 介面的元素。
將以下程式碼複製並儲存到build.gradle檔案中。
task groovyJDK << {
String myName = "Marc";
myName.each() {
println "${it}"
};
}
在命令提示符中執行以下命令。它執行上面給出的指令碼。您應該在儲存 build.gradle 檔案的位置執行此操作。
C:\> gradle –q groovyJDK
輸出
執行上述程式碼時,您應該看到以下輸出:
M a r c
屬性訪問器
您可以透過指定屬性的引用來自動訪問特定屬性的適當 getter 和 setter 方法。
以下程式碼片段定義了屬性buildDir的 getter 和 setter 方法的語法。
// Using a getter method
println project.buildDir
println getProject().getBuildDir()
// Using a setter method
project.buildDir = 'target'
getProject().setBuildDir('target')
方法呼叫中的可選括號
Groovy 在方法呼叫中包含一個特殊特性,即方法呼叫的括號是可選的。此特性也適用於 Gradle 指令碼。
讓我們來看下面的語法。它定義了test物件的systemProperty方法呼叫。
test.systemProperty 'some.prop', 'value'
test.systemProperty('some.prop', 'value')
閉包作為最後一個引數
Gradle DSL 在許多地方使用閉包,其中方法的最後一個引數是一個閉包。您可以將閉包放在方法呼叫之後。
以下程式碼片段定義了閉包用作 repositories() 方法引數的語法。
repositories {
println "in a closure"
}
repositories() {
println "in a closure"
}
repositories({ println "in a closure" })
預設匯入
Gradle 會自動向 Gradle 指令碼新增一組 import 語句。以下列表顯示了 Gradle 指令碼的預設匯入包。
Gradle 指令碼的預設匯入包如下:
import org.gradle.* import org.gradle.api.* import org.gradle.api.artifacts.* import org.gradle.api.artifacts.cache.* import org.gradle.api.artifacts.component.* import org.gradle.api.artifacts.dsl.* import org.gradle.api.artifacts.ivy.* import org.gradle.api.artifacts.maven.* import org.gradle.api.artifacts.query.* import org.gradle.api.artifacts.repositories.* import org.gradle.api.artifacts.result.* import org.gradle.api.component.* import org.gradle.api.credentials.* import org.gradle.api.distribution.* import org.gradle.api.distribution.plugins.* import org.gradle.api.dsl.* import org.gradle.api.execution.* import org.gradle.api.file.* import org.gradle.api.initialization.* import org.gradle.api.initialization.dsl.* import org.gradle.api.invocation.* import org.gradle.api.java.archives.* import org.gradle.api.logging.* import org.gradle.api.plugins.* import org.gradle.api.plugins.announce.* import org.gradle.api.plugins.antlr.* import org.gradle.api.plugins.buildcomparison.gradle.* import org.gradle.api.plugins.jetty.* import org.gradle.api.plugins.osgi.* import org.gradle.api.plugins.quality.* import org.gradle.api.plugins.scala.* import org.gradle.api.plugins.sonar.* import org.gradle.api.plugins.sonar.model.* import org.gradle.api.publish.* import org.gradle.api.publish.ivy.* import org.gradle.api.publish.ivy.plugins.* import org.gradle.api.publish.ivy.tasks.* import org.gradle.api.publish.maven.* import org.gradle.api.publish.maven.plugins.* import org.gradle.api.publish.maven.tasks.* import org.gradle.api.publish.plugins.* import org.gradle.api.reporting.* import org.gradle.api.reporting.components.* import org.gradle.api.reporting.dependencies.* import org.gradle.api.reporting.model.* import org.gradle.api.reporting.plugins.* import org.gradle.api.resources.* import org.gradle.api.specs.* import org.gradle.api.tasks.* import org.gradle.api.tasks.ant.* import org.gradle.api.tasks.application.* import org.gradle.api.tasks.bundling.* import org.gradle.api.tasks.compile.* import org.gradle.api.tasks.diagnostics.* import org.gradle.api.tasks.incremental.* import org.gradle.api.tasks.javadoc.* import org.gradle.api.tasks.scala.* import org.gradle.api.tasks.testing.* import org.gradle.api.tasks.testing.junit.* import org.gradle.api.tasks.testing.testng.* import org.gradle.api.tasks.util.* import org.gradle.api.tasks.wrapper.* import org.gradle.authentication.* import org.gradle.authentication.http.* import org.gradle.buildinit.plugins.* import org.gradle.buildinit.tasks.* import org.gradle.external.javadoc.* import org.gradle.ide.cdt.* import org.gradle.ide.cdt.tasks.* import org.gradle.ide.visualstudio.* import org.gradle.ide.visualstudio.plugins.* import org.gradle.ide.visualstudio.tasks.* import org.gradle.ivy.* import org.gradle.jvm.* import org.gradle.jvm.application.scripts.* import org.gradle.jvm.application.tasks.* import org.gradle.jvm.platform.* import org.gradle.jvm.plugins.* import org.gradle.jvm.tasks.* import org.gradle.jvm.tasks.api.* import org.gradle.jvm.test.* import org.gradle.jvm.toolchain.* import org.gradle.language.assembler.* import org.gradle.language.assembler.plugins.* import org.gradle.language.assembler.tasks.* import org.gradle.language.base.* import org.gradle.language.base.artifact.* import org.gradle.language.base.plugins.* import org.gradle.language.base.sources.* import org.gradle.language.c.* import org.gradle.language.c.plugins.* import org.gradle.language.c.tasks.* import org.gradle.language.coffeescript.* import org.gradle.language.cpp.* import org.gradle.language.cpp.plugins.* import org.gradle.language.cpp.tasks.* import org.gradle.language.java.* import org.gradle.language.java.artifact.* import org.gradle.language.java.plugins.* import org.gradle.language.java.tasks.* import org.gradle.language.javascript.* import org.gradle.language.jvm.* import org.gradle.language.jvm.plugins.* import org.gradle.language.jvm.tasks.* import org.gradle.language.nativeplatform.* import org.gradle.language.nativeplatform.tasks.* import org.gradle.language.objectivec.* import org.gradle.language.objectivec.plugins.* import org.gradle.language.objectivec.tasks.* import org.gradle.language.objectivecpp.* import org.gradle.language.objectivecpp.plugins.* import org.gradle.language.objectivecpp.tasks.* import org.gradle.language.rc.* import org.gradle.language.rc.plugins.* import org.gradle.language.rc.tasks.* import org.gradle.language.routes.* import org.gradle.language.scala.* import org.gradle.language.scala.plugins.* import org.gradle.language.scala.tasks.* import org.gradle.language.scala.toolchain.* import org.gradle.language.twirl.* import org.gradle.maven.* import org.gradle.model.* import org.gradle.nativeplatform.* import org.gradle.nativeplatform.platform.* import org.gradle.nativeplatform.plugins.* import org.gradle.nativeplatform.tasks.* import org.gradle.nativeplatform.test.* import org.gradle.nativeplatform.test.cunit.* import org.gradle.nativeplatform.test.cunit.plugins.* import org.gradle.nativeplatform.test.cunit.tasks.* import org.gradle.nativeplatform.test.googletest.* import org.gradle.nativeplatform.test.googletest.plugins.* import org.gradle.nativeplatform.test.plugins.* import org.gradle.nativeplatform.test.tasks.* import org.gradle.nativeplatform.toolchain.* import org.gradle.nativeplatform.toolchain.plugins.* import org.gradle.platform.base.* import org.gradle.platform.base.binary import org.gradle.platform.base.component.* import org.gradle.platform.base.plugins.* import org.gradle.platform.base.test.* import org.gradle.play.* import org.gradle.play.distribution.* import org.gradle.play.platform.* import org.gradle.play.plugins.* import org.gradle.play.tasks.* import org.gradle.play.toolchain.* import org.gradle.plugin.use.* import org.gradle.plugins.ear.* import org.gradle.plugins.ear.descriptor.* import org.gradle.plugins.ide.api.* import org.gradle.plugins.ide.eclipse.* import org.gradle.plugins.ide.idea.* import org.gradle.plugins.javascript.base.* import org.gradle.plugins.javascript.coffeescript.* import org.gradle.plugins.javascript.envjs.* import org.gradle.plugins.javascript.envjs.browser.* import org.gradle.plugins.javascript.envjs.http.* import org.gradle.plugins.javascript.envjs.http.simple.* import org.gradle.plugins.javascript.jshint.* import org.gradle.plugins.javascript.rhino.* import org.gradle.plugins.javascript.rhino.worker.* import org.gradle.plugins.signing.* import org.gradle.plugins.signing.signatory.* import org.gradle.plugins.signing.signatory.pgp.* import org.gradle.plugins.signing.type.* import org.gradle.plugins.signing.type.pgp.* import org.gradle.process.* import org.gradle.sonar.runner.* import org.gradle.sonar.runner.plugins.* import org.gradle.sonar.runner.tasks.* import org.gradle.testing.jacoco.plugins.* import org.gradle.testing.jacoco.tasks.* import org.gradle.testkit.runner.* import org.gradle.util.*