[groovy] 다른 그루비에 그루비 스크립트 포함

다른 groovy 스크립트에서 groovy 파일을 가져 오는 방법을 읽었습니다.

하나의 그루비 파일에 공통 함수를 정의하고 다른 그루비 파일에서 해당 함수를 호출하고 싶습니다.

나는 이것이 스크립팅 언어처럼 Groovy를 사용한다는 것을 이해합니다. 즉, 클래스 / 객체가 필요하지 않습니다. 나는 그루비에서 할 수있는 dsl과 같은 것을 시도하고 있습니다. 모든 변수는 Java에서 어설 션되며 쉘에서 그루비 스크립트를 실행하고 싶습니다.

이것이 가능합니까? 누군가가 몇 가지 예를 제공 할 수 있습니까?



답변

evaluate(new File("../tools/Tools.groovy"))

그것을 스크립트 맨 위에 놓으십시오. 그러면 그루비 파일의 내용이 표시됩니다 (큰 따옴표 사이의 파일 이름을 그루비 스크립트로 바꾸면됩니다).

놀랍게도 “Tools.groovy”라는 클래스로이 작업을 수행합니다.


답변

Groovy 2.2부터는 새로운 @BaseScriptAST 변환 주석을 사용하여 기본 스크립트 클래스를 선언 할 수 있습니다 .

예:

MainScript.groovy 파일 :

abstract class MainScript extends Script {
    def meaningOfLife = 42
}

test.groovy 파일 :

import groovy.transform.BaseScript
@BaseScript MainScript mainScript

println "$meaningOfLife" //works as expected


답변

이를 수행하는 또 다른 방법은 그루비 클래스에서 함수를 정의하고 런타임에 파일을 구문 분석하고 클래스 경로에 추가하는 것입니다.

File sourceFile = new File("path_to_file.groovy");
Class groovyClass = new GroovyClassLoader(getClass().getClassLoader()).parseClass(sourceFile);
GroovyObject myObject = (GroovyObject) groovyClass.newInstance();


답변

최선의 선택은 그루비 클래스의 형태로 유틸리티를 구성하고, 클래스 경로에 추가하고, 메인 스크립트가 import 키워드를 통해 참조하도록하는 것입니다.

예:

scripts / DbUtils.groovy

class DbUtils{
    def save(something){...}
}

scripts / script1.groovy :

import DbUtils
def dbUtils = new DbUtils()
def something = 'foobar'
dbUtils.save(something)

실행 스크립트 :

cd scripts
groovy -cp . script1.groovy


답변

이 작업을 수행하는 방법은 GroovyShell.

GroovyShell shell = new GroovyShell()
def Util = shell.parse(new File('Util.groovy'))
def data = Util.fetchData()


답변

Groovy에는 다른 파일의 내용을 문자 그대로 포함하는 일반적인 스크립팅 언어와 같은 가져 오기 키워드가 없습니다 (여기에 언급 됨 : Groovy가 포함 메커니즘을 제공합니까? ).
객체 / 클래스 지향적 특성 때문에 이러한 작업을 수행하려면 “게임”을해야합니다. 한 가지 가능성은 모든 유틸리티 함수를 정적으로 만든 다음 (객체를 사용하지 않는다고 말 했으므로) 실행중인 셸 컨텍스트에서 정적 가져 오기를 수행하는 것입니다. 그런 다음 “전역 함수”와 같은 메서드를 호출 할 수 있습니다. ) 셸을 만들고 원하는 모든 함수를 메서드에 바인딩하는 동안 (여기서 단점은 바인딩의 모든 메서드를 열거해야하지만 리플렉션을 사용할 수 있다는 것입니다). 또 다른 해결책은
또 다른 가능성은 Binding 개체 ( http://groovy.codehaus.org/api/groovy/lang/Binding.htmlmethodMissing(...) 셸에 할당 된 델리게이트 객체 입니다. 이렇게하면 기본적으로 맵이나 원하는 방법을 사용하여 동적 디스패치를 ​​수행 할 수 있습니다.

이러한 방법 중 일부는 http://www.nextinstruction.com/blog/2012/01/08/creating-dsls-with-groovy/에서 설명 합니다. 특정 기술의 예를보고 싶다면 알려주세요.


답변

외부 스크립트를 Java 클래스로 취급하는 것은 어떻습니까? 이 기사를 기반으로 : https://www.jmdawson.net/blog/2014/08/18/using-functions-from-one-groovy-script-in-another/

getThing.groovy 외부 스크립트

def getThingList() {
    return ["thing","thin2","thing3"]
}

printThing.groovy 메인 스크립트

thing = new getThing()  // new the class which represents the external script
println thing.getThingList()

결과

$ groovy printThing.groovy
[thing, thin2, thing3]