如何将 groovy dsl 脚本从一个 groovy 文件包含到另一个文件

how to include groovy dsl script from one groovy file to another

我使用 groovy 脚本中的方法创建了自定义 dsl 命令链。我在从另一个 groovy 文件访问此命令链时遇到问题。有没有办法实现功能?

我已经尝试使用能够加载 groovy 文件的 "evaluate",但它无法执行命令链。我试过使用 Groovy shell class ,但无法调用这些方法。

show = { 
        def cube_root= it
}

cube_root = { Math.cbrt(it) }

def please(action) {
    [the: { what ->
        [of: { n ->
            def cube_root=action(what(n))
                println cube_root;
        }]
    }]
}

please show the cube_root of 1000

这里我有一个 CubeRoot.groovy,其中执行 "please show the cube_root of 1000" 产生的结果为 10

我有另一个名为 "Main.groovy" 的 groovy 文件。有没有办法直接在 Main.groovy 中执行上述命令链作为 "please show the cube_root of 1000" 并获得所需的输出?

Main.groovy

please show the cube_root of 1000

在groovy/java

中没有include操作

你可以使用 GroovyShell

如果您可以将 "dsl" 表示为闭包,那么例如这应该有效:

//assume you could load the lang definition and expression from files  
def cfg = new ConfigSlurper().parse( '''
    show = { 
            def cube_root= it
    }

    cube_root = { Math.cbrt(it) }

    please = {action->
        [the: { what ->
            [of: { n ->
                def cube_root=action(what(n))
                    println cube_root;
            }]
        }]
    }  
''' )

new GroovyShell(cfg as Binding).evaluate(''' please show the cube_root of 1000 ''')

另一种方式 - 使用 class 加载器

文件Lang1.groovy

class Lang1{
    static void init(Script s){
        //let init script passed as parameter with variables 
        s.show = { 
           def cube_root= it
        }
        s.cube_root = { Math.cbrt(it) }

        s.please = {action->
            [the: { what ->
                [of: { n ->
                    def cube_root=action(what(n))
                        println cube_root;
                }]
            }]
        }  
    }
}

文件Main.groovy

Lang1.init(this)

please show the cube_root of 1000
来自命令行的

和 运行:groovy Main.groovy