讀取和設置Project和Task的屬性是很重要的一塊內容,每一個Project和Task實例都提供了能夠經過getter和setter方法訪問的屬性。一個屬性多是一個任務的描述或者項目的版本。你也能夠定義本身的屬性。Gradle容許用戶經過擴展屬性自定義一些變量。還有,不少Plugin都會加入擴展屬性,能夠經過設置屬性來控制使用Pulgin。api
1 Project自帶的屬性閉包
Gradle在默認狀況下已經爲Project定義了不少屬性,其中比較經常使用的有:
project:Project自己對象
name:Project的名字
path:Project的絕對路徑
description:Project的描述信息
buildDir:Project構建結果存放目錄
version:Project的版本號
屬性均可以經過getter和setter方法來訪問,也能夠直接使用點好的形式來訪問,例如:學習
setDescription('myProject') println "Description of project $name: "+project.description
當在build.gradle中訪問屬性和方法的時候,不須要使用project變量,它會假設你使用的是project實例。可是有一些狀況須要注意,例如:gradle
version = 'this is the project version' description = 'this is the project description' task showProjectProperties << { println version println project.description println description }
因爲Task自己也有description屬性,因此當在Task中,若是不顯式的指定project,就會打印的是Task的description。這是由於定義Task的閉包將delegate設置成了當前的Task。有關delegate的介紹,咱們能夠看前一篇文章。
Gradle還爲咱們提供了多種方法來自定義Project的Property。ui
2 額外屬性this
Gradle的不少領域模型類提供了特別的屬性支持。在內部,這些屬性以簡直對的形式存儲。爲了添加屬性,你須要使用ext命名空間。命令行
// 只在初始聲明額外屬性時須要使用ext命名空間 project.ext.myProp='myValue' ext{ someOtherProp=123 } // 使用ext命名空間訪問屬性是可選的 assert myProp=='myValue' println project.someOtherProp ext.someOtherProp=567
相似的,額外的屬性也能夠經過屬性文件來提供。code
3 Gradle屬性對象
Gradle屬性能夠經過在gradle.properties文件中聲明直接添加到項目中,這個文件位於<USER_HOME>/.gradle目錄或者項目的根目錄下。這些屬性能夠經過項目實例訪問。即便有多個項目,每一個用戶也只有能一個Gradle屬性文件在xx/.gradle目錄下,這是目前Gradle對它的限制。ip
在這個屬性文件中聲明的屬性對全部的項目可用。
咱們假設在gradle.properties文件中聲明的:
exampleProp=myValue someOtherProp=455
能夠按照以下方式訪問項目中的這兩個變量
assert project.exampleProp=='myValue' task printGradleProperties <<{ println "Second property :$someOtherProp" }
4 聲明屬性的其餘方式
前面兩種方式,咱們大多用來聲明自定義變量及其值。Gradle也提供了不少其餘方式爲構建提供屬性。
4.1 項目屬性經過 -P命令行選項提供
對於下面的例子,
task printMyProperties <<{ println myProperties }
若是咱們直接執行 gradle -q printMyProperties 命令,會報錯:
* What went wrong: Execution failed for task ':printMyProperties'. > Could not get unknown property 'myProperties' for task ':printMyProperties' of type org.gradle.api.DefaultTask.
這是由於myProperties屬性沒有定義,因此咱們在調用gradle命令的時候能夠經過 -P 命令來傳參數,就能夠把這個屬性打印出來。
gradle -q -P myProperties='this is -P params' printMyProperties
4.2 系統屬性經過 -D命令行選項提供
與在Java中相似的,咱們在Gradle中也能夠經過-D來定義JVM的系統參數,只是須要增長一些約定,每一個經過-D 方式聲明的屬性前面都要以「org.gradle.project」爲前綴,例如:
gradle -q -D org.gradle.project.myProperties='this is -D params' printMyProperties
4.3 環境屬性模式提供
咱們能夠經過設置環境變量的形式來設置Project的屬性。可是也要增長一些約定,例如每一個屬性前面都要加上一個ORG_GRADLE_PROJECT_的前綴,例如:
ORG_GRADLE_PROJECT_propertyName=someValue
當你再去執行printMyProperties這個task的時候就不用傳參數了。
歡迎加入學習交流羣569772982,你們一塊兒學習交流。