如何为甘特能够通过它们的名字引用的目标,并没有得到一个丢失的财产异常?
-
19-09-2019 - |
题
在这里给出的代码:甘特文件,有以下代码:
target(dist: 'Create release artefacts') {
depends(test)
depends(jar)
}
target(run: 'Run the distributed jar') {
depends(dist)
Ant.java(jar: distributedJarPath, fork: 'true')
}
target(hello: 'Hello World') {
println("Hello World")
}
setDefaultTarget(dist)
我感兴趣的是它是如何能写setDefaultTarget(dist)
,并没有收到有关dist
异常作为丢失财物。难道这个片段在一些对象的上下文评估,目标创建实例变量?
解决方案
有你需要考虑,脚本的绑定和目标的声明方式。两个项目
首先是结合。 Groovy脚本是一个Groovy / Java类有点不同。 Groovy脚本允许绑定的变量。当您编译变量不需要申报的脚本含义。当编译器看到这些未申报的变量引用之一,它将refrence转换为变量在幕后向binding.getVariable通话(变量名)(或东西左右)。因此脚本的最后一行是功能上equivilant到
setDefaultTarget(binding.getVariable('dist'))
其次存在为目标的声明。当目标被宣布Groovy编译器实际上是看到一个方法调用:目标(地图指定参数时,关闭封)(左右)。当这种方法执行它检查指定参数时,提取所述目标的名称,并在结合以该名称存储一些包裹参照闭合。一个appropximation将..
target(Map args, Closure closure) {
binding.setVarialbe(
args.keySet().iterator().next(),
gantClosureWrapping(args, closure))
}
当然上面的代码是一个近似值,而不是真正的GANT代码。
所以在本质上...
target(dist: 'doc') { ... }
// the above adds 'dist' as a variable to the binding
//...
setDefaultTarget(dist)
// dist is unbound, so it is replaced with binding.getVariable('dist')
不隶属于 StackOverflow