Gradle任务在外部进程“准备就绪”时进行处理

时间:2012-12-21 09:14:11

标签: gradle

我希望我的gradle任务:

  1. 执行命令(“启动我的服务器”的外部进程)。
  2. 等待外部进程的某个输出在stdout中说“Server Is Ready”。
  3. 在我的gradle任务中做一些事情(基本上是与我的外部任务交谈)。
  4. 当我完成了我的工作时,通过启动另一个“停止我的服务器”命令来结束外部进程。
  5. 当两个命令都完成时,结束任务。
  6. 这就像启动服务器来运行集成测试一样,但这不是tomcat / jetty类型的服务器,因此需要从命令行启动并等待服务器通过服务器的stdout“准备好”。

    我目前能够使用exec任务来运行我的任务并获得输出。所以我想我可以在Groovy / Java中编写代码以实现我想要的目标。

    然而,编写这种看似常见的模式似乎很乏味。所以我想知道是否有一种更简单的方法来解决这些问题而无需太多的编码 - 也就是说,这是gradle有DSL的常见模式吗?

    请注意,我是Gradle的新手,所以对此主题的任何建议也将不胜感激。

2 个答案:

答案 0 :(得分:1)

据我所知,当前版本的Gradle(1.4)没有专门的DSL支持来启动/关闭外部进程。你可以在构建脚本里面的groovy中实现它,它应该不会太难。

答案 1 :(得分:0)

整体模式:可能不是 - 有太多不同的可能性/组合可以存在任何类型的标准模板。

但是使用一组任务构建自己的逻辑很简单。 最复杂的部分是等待外部进程,Gradle确实有一个DSL(Ant实际上有核心逻辑/ DSL,Gradle只是包装它)。

我的任务是等待Postgres进入本地docker容器:

task waitForLocalDb(){
  group = 'docker.db'
  mustRunAfter localApiSvcDbRunCleanContainer
  doFirst{
    println "waiting for Postgres to come up"
    ant.waitfor(
      maxwait:"10", maxwaitunit:"second", 
      checkevery:"500", checkeveryunit: "millisecond"
    ){
      socket(server:"192.168.99.100", port:"5544")
    }
  }
}

等待Postgres检查它是否正在侦听指定的端口。

您可以使用Ant waitfor任务执行各种操作 - 例如检查服务器是否说“服务器准备就绪”#34;在某个文件中("在stdout"很大程度上取决于你如何启动你的过程)。

或者您可以检查"服务器已准备就绪"或者特定网址中的类似内容,请参阅https://stackoverflow.com/a/2548226/924597