1

在此处提供的代码:Gant 文件中,有以下代码:

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这个片段是否在某个对象的上下文中评估,并且目标创建实例变量?

4

1 回答 1

1

您需要考虑两个项目,脚本的绑定以及如何声明目标。

首先是绑定。Groovy 脚本与 Groovy/Java 类有点不同。Groovy 脚本允许未绑定的变量。这意味着当您编译脚本时,不需要声明变量。当编译器看到这些未声明的变量引用之一时,它会将引用转换为隐蔽的变量以调用 binding.getVariable(variable name) (或类似的东西)。所以脚本的最后一行在功能上等同于

setDefaultTarget(binding.getVariable('dist'))

其次是目标的声明。当目标被声明时,Groovy 编译器实际上看到了一个方法调用:target(Map args, Closure closure)(或类似的)。当这个方法执行时,它会检查 args,提取目标的名称,并通过该名称在绑定中存储一些对闭包的包装引用。一个近似将是..

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')
于 2010-02-09T19:50:20.150 回答