如何将 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
我使用 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