根据开放端口寻找任务输入和输出。
类似
ext {
serverReady checkPortOpen()
}
task MyTask {
inputs.property ext.serverReady
outputs.property ext.serverReady
}
任何帮助或指示?
答案 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
。