gradle脚本变量和属性扩展

在gradle构建脚本中有两种类型的变量可以声明:局部变量 ( local ) 和 扩展属性 ( extra )

局部变量

局部变量使用关键字 def 来声明,其只在声明它的地方可见 . 局部变量是 Groovy 语言的一个基本特性

def var = "var_value"

task testLocalVar() {
    def varInner = "inner"
    println("local var's value:["+var+"]")
}

//println("local varInner's value:["+varInner+"]")
c:\>gradle testLocalVar
local var's value:var_value
:testLocalVar UP-TO-DATE

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
See https://docs.gradle.org/4.5.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 2s

去掉注释行 脚本会报错~找不到对应的变量。变量作用域知识

扩展属性

给出简单例子

ext {
    extProperties="extProperties_value"
}

task printProperties << {
    println extProperties
}
:printProperties
extProperties_value

属性扩展允许将新属性添加到现有的域对象中。类似map可以存储键值对,所有的已知扩展有一个统一的类型”ext”,支持扩展的对象有projects, tasks, configurations, dependencies等。可以在运行时使用其他对象扩展的对象。

class MyExtension {
  String foo

  MyExtension(String foo) {
    this.foo = foo
  }
}

project.extensions.create('custom', MyExtension, "bar")

println project.custom instanceof MyExtension
println project.custom.foo == "bar"

project.custom {
  println foo == "bar"
  foo = "other"
}
println project.custom.foo == "other"

println project.custom instanceof ExtensionAware
project.custom.extensions.create("nested", MyExtension, "baz")
println project.custom.nested.foo == "baz"

println project.hasProperty("myProperty") == false
project.ext.myProperty = "myValue"

println project.myProperty == "myValue"

更详细添加创建扩展资料

属性扩展的一个重要特性是,它的所有属性都通过具有扩展名的ExtensionAware对象来进行读取和写入

project.ext.set("myProp", "myValue")
println project.myProp == "myValue"

project.myProp = "anotherValue"
println project.myProp == "anotherValue"
println project.ext.get("myProp") == "anotherValue"

属性扩展对象支持groovy属性语法。也就是说,可以通过扩展来读取属性

//展示不同的赋值方式
//1、
project.ext {
  myprop = "a"
}
//读取值并判断(下同)
println project.myprop == "a"
println project.ext.myprop == "a"

//2、
project.myprop = "b"
println project.myprop == "b"
println project.ext.myprop == "b"
//3、
project.ext["otherProp"] = "a"
println project.otherProp == "a"
println project.ext["otherProp"] == "a"

属性

properties
Map<String, Object> properties (read-only)
返回所有已注册的属性和它们的当前值作为一个映射。返回的映射与扩展分离。也就是说,对映射所做的任何更改都不会改变它的扩展名。

project.version = "1.0"

println project.hasProperty("version")
println project.ext.properties.containsKey("version") == false

project.ext.foo = "bar"

println project.ext.properties.containsKey("foo")
println project.ext.properties.foo == project.ext.foo

println project.ext.properties.every { key, value -> project.properties[key] == value }
c:\>gradle build
true
true
true
true
true
:buildEnvironment

------------------------------------------------------------
Root project
------------------------------------------------------------

classpath
No dependencies

Deprecated Gradle features were used in this build, making it incompatible with Gradle 5.0.
See https://docs.gradle.org/4.5.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 3s
1 actionable task: 1 executed

方法

Method Description
get(name) 用给定的名称返回对应属性的值。当使用Groovy的额外属性扩展时,可以通过Groovy的属性语法获得属性。
has(name) 通过指定的名称来返回该扩展是否拥有某一个属性
set(name, value) 更新或者创建一个键值对
//projct扩展属性 projectFoo
project.ext { projectFoo = "bar" }

println project.ext.get("projectFoo") == "bar"
println project.ext.projectFoo == "bar"
println project.ext["projectFoo"] == "bar"
println project.projectFoo == "bar"
println project["projectFoo"] == "bar"

//是否具有某属性hasFoo
println "has :"+ (project.ext.has("hasFoo") == false)
println "has :"+ (project.hasProperty("hasFoo") == false)

project.ext.hasFoo = "bar"

println "has :"+ project.ext.has("hasFoo")
println "has :"+ project.hasProperty("hasFoo")

//设置新的key/value
project.ext.set("setFoo", "bar")
project.ext.setFoo = "bar"
project.ext["setFoo"] = "bar"

//可以更新已经存在的值
project.setFoo = "newbar"
project["setFoo"] = "newbar"
////////增加判断~~
c:\>gradle build
true
true
true
true
true
has :true
has :true
has :true
has :true
:buildEnvironment

------------------------------------------------------------
Root project
------------------------------------------------------------

猜你喜欢

转载自blog.csdn.net/yue530tomtom/article/details/79399417
今日推荐