从 gradle 中运行 groovy 脚本

发布于 2024-08-23 05:53:24 字数 436 浏览 7 评论 0原文

创建运行 Groovy 脚本的 gradle 任务的最佳方法是什么?我意识到 gradle 构建文件是 groovy,所以我认为可以做这样的事情:

task run << {
    Script app = new GroovyShell().parse(new File("examples/foo.groovy"))
    // or replace .parse() w/ a .evalulate()?
    app.run()
}

如果 bar.groovy 使用 @Grab 注释,当我尝试此操作时,我会收到各种奇怪的错误甚至进行简单的导入。我想创建一个 gradle 任务来处理这个问题,这样我就可以重用类路径定义。

examples 目录移动到 src 目录中的某个位置会更好吗?最佳实践是什么?

What's the best way to create a gradle task, which runs a groovy script? I realize that gradle build files are groovy, so I would think it would be possible to do something like this:

task run << {
    Script app = new GroovyShell().parse(new File("examples/foo.groovy"))
    // or replace .parse() w/ a .evalulate()?
    app.run()
}

I get all kinds of whacky errors when I try this if bar.groovy is using @Grab annotations or even doing simple imports. I want to create a gradle task to handle this, so that I can hopefully reuse the classpath definition.

Would it be better to move the examples directory into the src directory somewhere? What's a best practice?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

软甜啾 2024-08-30 05:53:24

或者你可以这样做:

new GroovyShell().run(file('somePath'))

Or you could do:

new GroovyShell().run(file('somePath'))
挽心 2024-08-30 05:53:24

您可以尝试使用 GroovyScriptEngine 而不是 GroovyShell。我之前已经将它与@Grab 注释一起使用。您将需要类路径上的所有 groovy,groovy-all.jar 还不够。我猜 Ivy 没有打包在 groovy-all.jar 中。像这样的东西应该能解决问题:

这个脚本假定 /tmp/HelloWorld.groovy 中有一个 groovy 脚本

def pathToFolderOfScript = '/tmp'
def gse = new GroovyScriptEngine([pathToFolderOfScript] as String[])
gse.run('HelloWorld.groovy', new Binding())

You could try using GroovyScriptEngine instead of the GroovyShell. I've used it previously with @Grab annotations. You will need all of groovy on the classpath, the groovy-all.jar will not be enough. I'm guessing Ivy isn't packaged in the groovy-all.jar. Something like this should to the trick:

This script presumes a groovy script at /tmp/HelloWorld.groovy

def pathToFolderOfScript = '/tmp'
def gse = new GroovyScriptEngine([pathToFolderOfScript] as String[])
gse.run('HelloWorld.groovy', new Binding())
椵侞 2024-08-30 05:53:24

http://wayback .archive.org/web/20131006153845/http://docs.codehaus.org/display/GRADLE/Cookbook#Cookbook-runningthingsfromGradle

ant.java(classname: 'com.my.classname', fork: true,
         classpath: "${sourceSets.main.runtimeClasspath.asPath}")

http://wayback.archive.org/web/20131006153845/http://docs.codehaus.org/display/GRADLE/Cookbook#Cookbook-runningthingsfromGradle

ant.java(classname: 'com.my.classname', fork: true,
         classpath: "${sourceSets.main.runtimeClasspath.asPath}")
烟酒忠诚 2024-08-30 05:53:24

我认为您可能需要将脚本作为新进程运行...例如,

["groovy","examples/foo.groovy"].execute()

我猜测 Gradle 的执行方式不是通过调用 groovy ,因此使 @Grab 工作的设置永远不会发生。也可能是 Gradle 使用的 Groovy 版本不支持 @Grab。

I think you probably need to run the script as a new process... e.g.,

["groovy","examples/foo.groovy"].execute()

I would guess that the way Gradle is executed is not via invoking groovy, so the setup that makes @Grab work never happens. It could also be the the version of Groovy that Gradle uses doesn't support @Grab.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文