Gant는 자신의 이름으로 목표를 어떻게 참조 할 수 있으며, 속성 예외가 없어지지 않습니까?

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 누락 된 속성으로. 이 스 니펫이 일부 객체의 맥락에서 평가되고 대상이 인스턴스 변수를 생성합니까?

도움이 되었습니까?

해결책

고려해야 할 두 가지 항목, 스크립트의 바인딩 및 대상이 선언되는 방법이 있습니다.

먼저 바인딩이 있습니다. 그루비 스크립트는 그루비/자바 클래스와 약간 다릅니다. 그루비 스크립트는 결합되지 않은 변수를 허용합니다. 의미 스크립트를 컴파일 할 때 변수를 선언 할 필요가 없습니다. 컴파일러가 이러한 선언되지 않은 변수 참조 중 하나를 볼 때, 커버 아래의 변수로 굴절을 바인딩. getVariable (변수 이름) (또는 그에 따라 무언가)로 변수로 변환합니다. 그래서 스크립트의 마지막 줄은 기능적으로 동일합니다.

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))
}

물론 위의 코드는 근사치이며 실제 간트 코드가 아닙니다.

그래서 본질적으로 ...

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