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.*
廣告
© . All rights reserved.