Gradle 当外部进程为“时,执行处理的梯度任务”;准备好了吗;

Gradle 当外部进程为“时,执行处理的梯度任务”;准备好了吗;,gradle,Gradle,我希望我的gradle任务: 执行命令(“启动我的服务器”的外部进程) 等待外部进程的特定输出,在标准输出中说“服务器就绪” 在我的gradle任务中做点什么(基本上是与我的外部任务对话) 当我完成工作后,通过启动另一个“停止我的服务器”命令来结束外部进程 两个命令完成后,结束任务 这类似于启动服务器来运行集成测试,但这不是tomcat/jetty类型的服务器,因此需要从命令行启动它,并等待服务器通过服务器的标准输出“就绪” 我目前可以使用exec任务运行我的任务并获得输出。所以我想我可以用Gr

我希望我的gradle任务:

  • 执行命令(“启动我的服务器”的外部进程)
  • 等待外部进程的特定输出,在标准输出中说“服务器就绪”
  • 在我的gradle任务中做点什么(基本上是与我的外部任务对话)
  • 当我完成工作后,通过启动另一个“停止我的服务器”命令来结束外部进程
  • 两个命令完成后,结束任务
  • 这类似于启动服务器来运行集成测试,但这不是tomcat/jetty类型的服务器,因此需要从命令行启动它,并等待服务器通过服务器的标准输出“就绪”

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

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


    请注意,我是Gradle的新手,因此,如果您对这个主题有任何建议,我将不胜感激。

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

    总体模式:可能不会-有太多不同的可能性/组合,不可能有任何类型的标准模板

    但用一组任务构建自己的逻辑很简单。 最复杂的部分是等待外部进程,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是否正在侦听指定的端口来等待Postgres

    您可以使用Ant任务执行各种操作,比如检查服务器是否在某个文件中的某个位置显示“服务器已就绪”(“在stdout中”在很大程度上取决于您启动进程的方式)


    或者,您可以在特定URL中检查“服务器已就绪”或类似内容,请参见

    ,据我所知,没有现成的支持。我实现了一个类似的方法。该代码可能会给您一个开始。@kctang如果您对所使用的技术有明确的了解,我们可以为您提供精确的解决方案。并不是说你真的需要通过gradle编码,而是一些运行嵌入式测试框架的集成测试框架。@Rajmahendra它是一个自定义开发Java RMI服务器/客户端。我需要服务器应用程序write stdout“===服务器就绪===”,然后才能使用Java RMI客户端进行连接,以确认服务器工作正常,然后关闭并继续。