Gradle學習3——自定義屬性

讀取和設置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,你們一塊兒學習交流。

相關文章
相關標籤/搜索