Gradle Task:打开端口以用作TaskInput

时间:2014-11-20 06:37:15

标签: gradle

根据开放端口寻找任务输入和输出。

类似

ext {
  serverReady checkPortOpen()
}

task MyTask {
  inputs.property ext.serverReady
  outputs.property ext.serverReady
}

任何帮助或指示?

2 个答案:

答案 0 :(得分:2)

正如@Opal在gradle doc中指出的那样,有一个output.upToDate可以完美地完成工作。

在运行完整测试套件之前,我有一些服务要启动,所以我有一个:

 class BaseServiceTask extends com.github.jengelman.gradle.plugins.processes.tasks.JavaFork {
    def BaseServiceTask() {
      super()
      classpath project.configurations.all
      args ["-user","user","-password","password","-env","mydevenv"]
    }
 }

 task startServer (type:BaseServiceTask) {
    main = "com.nico.StartServer"
    jvmArgs += ["-Xmx8096m","-XX:MaxPermSize=256m"] // give more memory to data server
    outputs.upToDateWhen { checkSocket(servicePort) } 
    doLast {waitForSocket(servicePort)}
 }

更低的细节...

def checkSocket(portS) {
  try {
    new Socket("localhost", portS.toInteger())
    return true 
  } catch (Exception e) {
    return false
    // throw new GradleScriptException("Required ${portS} is closed", e )
  } 
}

def waitForSocket(portS) {
  while(!checkSocket(portS)) {
    println "Waiting on ${portS}"
    Thread.sleep(5000)
  }
}

最后,在运行相关的gradle任务时,输出应该是正确的最新状态:

 :startServer UP-TO-DATE

答案 1 :(得分:1)

正如您在docs中看到的TaskOutputs只有文件可以注册为输出 - 所以这里没有属性。

说到TaskInputs属性确实可以使用,你可以在&$ 39; $ GRADLE_HOME / samples / userguide / tasks / incrementalTask​​'下找到一个很好的例子。尝试运行:

gradle incrementalReverse -PtaskInputProperty=<property>

连续几次传递相同的<property>然后更改。这可能是您正在寻找的。 Here是对良好财产的要求(例如Serializable)。您似乎可以在属性中包装端口的状态,并将其用作@Input