缘由在于,Project和Task都拥有description属性。而定义Task的闭包将delegate设置成了当前的Task。故假设直接使用description。此时打印的是showProjectProperties的description。而不是Project的,因此咱们需要显式地指明project。有关delegate的不少其它知识,请參考本系列的这篇文章。java
Gradle还为咱们提供了多种方法来本身定义Project的Property。git
(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()进行获取。github
在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
在笔者所工做的项目中。咱们的持续集成server即是经过这样的方式为Gradle设置Property的。 闭包