【问题标题】:Extract info from a Groovy DSL file?从 Groovy DSL 文件中提取信息?
【发布时间】:2019-12-28 20:13:58
【问题描述】:

我最近将我的 logback 配置文件从 logback.xml 切换到 logback.groovy。在这类事情上,将 DSL 与 Groovy 一起使用比 XML 更通用。

我需要以编程方式分析这个文件,就像我分析以前的 XML 文件(任何无数的解析工具)一样。我意识到这将是不完美的,因为 DSL 配置文件位于它配置且必须执行的对象之上,因此其结果不可避免地是动态的,而 XML 文件是静态的。

如果您想在另一个文件中包含一个 Groovy 文件,有一些解决方案。 This one 为我工作。

但我很难从结果中找到我需要的东西。

如果我把这样的函数放在 DSL 文件中...

def greet(){
  println "hello world"
}

...我不仅可以执行它(config.greet()如下),而且我去的时候也可以看到它列出来

    GroovyShell shell = new GroovyShell()
    def config = shell.parse( logfileConfigPath.toFile() )
    println "config.class.properties ${config.class.properties}"

但是如果我在 DSL 文件中加入这样的一行...

def MY_CONSTANT = "XXX"

...我不知道如何找到它并获得它的价值(config.class.properties 的混乱和丰富的输出中没有它)。

PS 打印出config.properties 只是给出这个:

[class:class logback, binding:groovy.lang.Binding@564fa2b]

...是的,我确实看过config.binding.properties:什么都没有。

进一步思考

我的问题是,更广泛地说,是否有任何工具可用于分析 Groovy DSL 配置文件。鉴于如果没有它正在配置的底层对象(在 Gradle 的情况下实现 org.gradle.api.Project 的对象;我不知道在 logback 的情况下它可能是什么类),这样的文件是毫无意义的,你会想到那里需要仪器来连接这样的对象,然后以受控、可观察的方式观察配置文件的效果。如果 Groovy DSL 配置文件要像它们的 XML 对应文件一样通用,那么您肯定需要这些方面的东西吗?注意我怀疑org.gradle.tooling.model.GradleProjectorg.gradle.tooling.model.ProjectModel 可能会达到这个目的。不幸的是,目前我无法让GradleConnector 工作,详情为here

我认为 logback 没有这种类型的东西,目前我不知道它的 DSL 或可配置对象,或者后者的类或接口......

【问题讨论】:

    标签: parsing groovy logback dsl


    【解决方案1】:

    def的使用在脚本的执行中创建了一个在脚本绑定中不可用的局部变量;见this。即使删除 def 也不会在绑定中暴露 MY_CONSTANT,因为通过 GroovyShell.parse() 解析脚本不会解释/执行代码。

    要在config 的绑定中公开MY_CONSTANT,请将def MY_CONSTANT = "XXX" 更改为MY_CONSTANT = "XXX" 并通过config.run() 执行配置脚本。

    【讨论】:

    • 谢谢。有趣的想法,虽然我的目标不是运行脚本而是检查它。毫不奇怪,config.run() 根本不起作用,因为,这就是 Groovy DSL 配置文件的重点,我的 logback.groovy 就像骑着大象的人:它在那里指导底层对象。所以config.run() 在遇到底层“logback 对象”的第一个属性时立即抛出了MissingPropertyException。另一件事:我不明白为什么局部变量是不可见的,但局部函数是可见的。
    • 关于可见性,如here 所述,本地/声明的变量在编译器生成的run() 方法中声明。因此,它不能通过绑定访问。另外,解析后,只有表达式(不是值)可以与变量关联。
    • @mikerodent 有一些方法可以执行 Groovy DSL 配置文件而不会导致异常(在所有情况下)。请参阅GafferConfigurator.run 了解如何执行此操作。即便如此,查看编译器生成的run() 方法来访问本地/声明的变量将是一个障碍。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多