請通過以下方式下載下傳本系列文章的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的。