如何为甘特能够通过它们的名字引用的目标,并没有得到一个丢失的财产异常?

StackOverflow https://stackoverflow.com/questions/2231972

在这里给出的代码:甘特文件,有以下代码:

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')
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top