Gradle作為一款專案構建工具,由於其強大、靈活、快速、完全相容Ant等特性,越來越受到人們歡迎。Gradle的靈活有時候也會引起人們的困惑。比如在Gradle中設定變數和屬性就有N種辦法。由於Gradle的理念是Convention over configruation(約定優於配置),所以如果瞭解了這些約定,那麼在使用Gradle的屬性配置時一定會如魚得水。
在專案根目錄下建立名為gradle.properties檔案,在該檔案中定義需要的屬性。這些屬性在Gradle構建Gradle領域物件(即project物件例項)時會被自動加到project物件例項中作為其屬性被直接呼叫。
gradle.properties build.gradle
1
2
3
4
task hello << {
println $guestName
println "hello, $guestName"
}
1
2
3
4
5
6
$ gradle hello -q
Bowen
hello, Bowen
$ gradle properties | grep guestName
guestName: Bowen
定義在build.gradle中的ext塊中。ext準確的說是Gradle領域物件的一個屬性,我們可以將自定義的屬性新增到ext物件上,Build.gradle中的其它程式碼片段可以使用。
build.gradle
1
2
3
4
5
6
7
8
ext {
guestName = 'Bowen'
}
task hello << {
println guestName
println "hello, $guestName"
}
1
2
3
4
5
6
7
8
$ gradle hello -q
Bowen
hello, Bowen
$ gradle properties | grep guestName
guestName: Bowen
$ gradle properties | grep ext
ext: org.gradle.api.internal.plugins.DefaultExtraPropertiesExtension@10ef5fa0
從上述可以看到ext物件其實是DefaultExtraPropertiesExtension物件的一個例項。
在命令列中通過-D
或者-P
給Gradle實時建立屬性。
-D
屬性會被傳送給啟動Gradle的jvm,作為一個系統屬性被jvm使用。
build.gradle
1
2
3
task hello << {
println System . properties [ 'guestName' ]
}
1
2
$ gradle hello -DguestName= 'Bowen' -q
Bowen
-P
屬性則會被直接載入到Gradle領域物件上。
build.gradle
1
2
3
task hello << {
println "hello, $guestName"
}
1
2
$ gradle hello -PguestName= 'Bowen' -q
hello, Bowen
在Gradle配置檔案中建立系統屬性。剛講過在gradle.properties檔案可以建立屬性,同時我們也可以建立系統屬性。如果有systemProp.
字首的屬性會被識別為系統屬性。
gradle.properties
1
systemProp.guestName = 'Bowen'
build.gradle
1
2
3
task hello << {
println "hello, " + System . properties [ 'guestName' ]
}
1
2
$ gradle hello -q
hello, Bowen
將特殊字首的系統屬性或環境變數自動加入到Gradle領域物件中。
如果有環境變數以ORG_GRADLE_PROJECT.
為字首,那麼該變數會被自動新增到Gradle領域物件中。同樣,如果有系統屬性以org.gradle.project.
為字首,那麼也會被自動加入到Gradl領域物件中。這一特性的目的之一是為了隱藏一些敏感的資訊。比如在執行Gradle指令碼時需要傳入密碼資訊,如果以-P
的方式傳送會被別人看到。而把該屬性儲存為環境變數,只有系統管理員才有權訪問和修改。在執行Gralde的時候該環境變數會被自動加入到Gradle物件中被使用,隔離了明暗資料,又不行影響其他使用者使用。(其他使用者可以通過-P
方式是設定該屬性)。
build.gradle
1
2
3
task hello << {
println "hello, " + guestName
}
1
2
3
4
5
6
$ gradle hello -Dorg.gradle.project.guestName= Bowen -q
hello, Bowen
$ export ORG_GRADLE_PROJECT_guestName = Bob
$ gradle hello -q
hello, Bob