12

我希望我的 gradle 任务:

  1. 执行命令(“启动我的服务器”的外部进程)。
  2. 等待来自我的外部进程的某个输出在标准输出中显示“服务器已就绪”。
  3. 在我的 gradle 任务中做一些事情(基本上是和我的外部任务交谈)。
  4. 当我完成我的工作时,通过启动另一个“停止我的服务器”命令来结束外部进程。
  5. 当两个命令都完成时,结束任务。

这就像启动一个服务器来运行集成测试,但这不是一个 tomcat/jetty 类型的服务器,所以它需要从命令行启动并通过服务器的标准输出等待服务器“准备好”。

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

但是,对这种看似常见的模式进行编码似乎很乏味。所以我想知道是否有一种更简单的方法可以在没有太多编码的情况下解决这些问题 - 即这是 gradle 具有 DSL 的常见模式吗?

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

4

2 回答 2

1

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

于 2013-03-19T09:20:11.747 回答
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任务来执行各种操作 - 例如检查服务器是否在某处的文件中说“服务器已准备好”(“在标准输出中”很大程度上取决于您启动进程的方式)。

或者您可以在特定 URL 中检查“服务器已准备好”或类似内容,请参阅https://stackoverflow.com/a/2548226/924597

于 2017-10-17T00:30:14.780 回答