1

我正在尝试稍微改变我的 groovy 脚本的实现方式。我仍然希望它们从命令行运行,但我真的很想允许从同一个脚本中调用不同的方法(对它们进行分组),我还想要一个自动文档系统。

我正在尝试运行这样的脚本:

@Doc("这是一个测试脚本")
公共测试脚本(
    @Doc("参数 1 是可选的") String param1="nobody"
)
{
    println "你好"+param1
}

如果它被命名,说“脚本”,我可以通过在命令行中说:“脚本 testScript”或“脚本 testScript world”来运行该方法。如果您使用“script --help”,您将使用@Doc 注释在屏幕上显示使用情况。

我希望使用的技巧是 Groovy 为脚本指定基类的能力。如果我使用 -b Base 我可以在执行孩子的“运行”方法之前运行 Base 的构造函数。

在这一点上,我需要拦截即将“运行”的呼叫,但我不知道该怎么做。无论我尝试什么,expandoMetaClass、invokeMethod,它们都不会拦截对孩子的 run() 方法的调用。(我相信 invokeMethod 有一些方法可以做“继承”,但它需要一个设置才能在 main() 中运行..而脚本没有其中之一)。

如果我承诺使用批处理文件或其他类来启动脚本,这将是微不足道的,但我真的不想在命令行中添加更多内容(我希望将 -b Base 放在环境变量中以便脚本仍会像您对 cli 的期望一样运行)。

这是我的基类的一个例子......

抽象类 Base 扩展脚本实现 GroovyInterceptable {
    公共基础(){
        println "执行完毕"
        assert(this.class.name == "script") // 它是子脚本的一个实例
        def metaClass = this.class.getMetaClass() // 应该是脚本的元
        metaClass.run = this.&myRun // 我相信这应该可以工作
    }
    定义我的运行()
    {
        println "从未调用,但脚本在 Base() 返回后运行"
    }
}
4

0 回答 0