Gradle ExecTask and Windows start



这个问题需要了解Window的启动命令的行为和自定义gradle ExecTask对它的处理。

问题

为什么只有在gradle ExecTask中执行应用程序时,才以应用程序为参数启动并等待应用程序退出?

解释

在命令行中,这将按预期工作(启动应用程序并返回,而无需等待应用程序退出):

cmd /c myBuildEnvironment.cmd && start "some title for start" devenv.exe my.sln

非常简单,它调用一个windows批处理脚本来设置环境,然后在Visual Studio中启动my.sln。工作正常,不需要等待Visual Studio关闭。这就是我的分级任务的目的。

同样的工作"有点",使用以下gradle ExecTask启动:

/**
* I know that the executable + args is replaced by commandLine.  They're
* just there for readability.
*/
task openVsSolution(type: Exec, dependsOn: setupVsSln) {
description 'Opens the VS solution, in the appropriate version of Visual Studio.'
executable 'start'
environment = taskEnv
workingDir '../../src/solution'
args = [vsDevEnv, 'my.sln']
commandLine winCmdPrefix + executable + args
}

Gradle很高兴地报告Build Successful,而Visual Studio仍然开放。

但是,我说"有点"是因为start实际上会忽略executable参数,并使用默认应用程序Microsoft Visual Studio Version Selector打开my.sln。因此,经过一些研究,我发现start假设第一个参数是窗口标题,然后是应用程序,最后是应用程序参数。所以,我尝试了这个:

task openVsSolution(type: Exec, dependsOn: setupVsSln) {
executable 'start'
environment = taskEnv
workingDir '../../src/solution'
args = ['some title for start', vsDevEnv, 'my.sln']
commandLine winCmdPrefix + executable + args
}

一切正常,start使用了Visual Studio的devenv.exe的正确版本,该版本因VC PlatformToolset而异,但。。。gradle坐在后台等待Visual Studio关闭。

为什么?我如何才能实现所有想要的行为

更新

这可能是一个环境问题。显然,在一个开发人员的机器上,最初的gradle启动任务也保持打开状态。因此,在特定的环境中,对start到gradle的任何调用都会等待它完成。情节越来越浓。。。

Gradle正在等待开始返回,这是我的猜测,请参阅本文-从Gradle运行后台作业。阅读答案后的注释,这是从Java开始的,所以如果有等价的&(在后台运行)对于windows,它不起作用。

你也可以尝试将它包装在一个bat文件中,在后台执行你想要的bat文件,然后立即返回,这样gradle就会很高兴。

希望这能有所帮助。

最新更新