天天看點

Gradle學習之自定義屬性

請通過以下方式下載下傳本系列文章的Github示例代碼:

git clone https://github.com/davenkin/gradle-learning.git

在前面的文章中我們講到,設定和讀取Project的Property是使用Gradle的一個很重要的方面。比如,很多Plugin都會向Project中加入額外的Property,在使用這些Plugin時,我們需要對這些Property進行指派。

Gradle在預設情況下已經為Project定義了很多Property,其中比較常用的有:

project:Project本身

name:Project的名字

path:Project的絕對路徑

description:Project的描述資訊

buildDir:Project建構結果存放目錄

version:Project的版本号

以下,我們首先設定Project的version和description屬性,再定義showProjectProperties以列印這些屬性:

version = 'this is the project version'

description = 'this is the project description'

task showProjectProperties << {

  println version

  println project.description

}

請注意,在列印description時,我們使用了project.description,而不是直接使用description。原因在于,Project和Task都擁有description屬性,而定義Task的閉包将delegate設定成了目前的Task,故如果直接使用description,此時列印的是showProjectProperties的description,而不是Project的,是以我們需要顯式地指明project。有關delegate的更多知識,請參考本系列的這篇文章。

Gradle還為我們提供了多種方法來自定義Project的Property。

(1)在build.gradle檔案中定義Property

在build.gradle檔案中向Project添加額外的Property時,我們并不能直接定義,而是應該通過ext來定義。如果要添加一個名為property1的Property,我們應該:

ext.property1 = "this is property1"

另外,我們也可以通過閉包的方式:

ext {   property2 = "this is property2"}

在定義了Property後,使用這些Property時我們則不需要ext,而是可以直接通路:

task showProperties << {

  println property1

  println property2

事實上,任何實作了ExtensionAware接口的Gradle對象都可以通過這種方式來添加額外的Property,比如Task也實作了該接口。

(2)通過指令行參數定義Property

Gradle還提供了-P指令行參數來設定Property,比如:

task showCommandLieProperties << {

  println property3

在執行“gradle showCommandLieProperties”時,終端輸出如下:

* What went wrong:Execution failed for task ':showCommandLieProperties'.> Could not find property 'property3' on task ':showCommandLieProperties'.

表示property3并沒有被定義,在調用gradle指令時,通過-P參數傳入該Property:

gradle -Pproperty3="this is property3" showCommandLieProperties

此時終端顯示:

:showCommandLiePropertiesthis is property3BUILD SUCCESSFUL

(3)通過JVM系統參數定義Property

我們知道,在java中,我們可以通過-D參數定義JVM的系統參數,然後在代碼中可以可以通過System.getProperty()進行擷取。在Gradle中,我們也可以通過-D的方式向Project傳Property,隻是此時我們需要遵循一些約定:每一個通過-D方式聲明的Property都需要以“org.gradle.project”為字首,對于上面的showCommandLieProperties,我們也可以通過以下方式

設定property3:

gradle -Dorg.gradle.project.property3="this is another property3" showCommandLieProperties

(4)通過環境變量設定Property

我們還可以通過設定環境變量的方式設定Project的Property。這種方式和(3)一樣,需要我們遵循一些約定:在定義環境變量時,每一個Property都需要以“ORG_GRADLE_PROJECT_”為字首:

export ORG_GRADLE_PROJECT_property3="this is yet another property3"

在調用showCommandLieProperties時,我們便不需要傳入指令行參數了:

gradle showCommandLieProperties

在筆者所工作的項目中,我們的持續內建伺服器便是通過這種方式為Gradle設定Property的。