这个问题需要了解Window的start命令的行为和自定义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任务要实现的目标。
同样的工作“有些”,使用以下gradle ExecTask with start:
/**
* 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
参数并使用默认应用程序my.sln
打开Microsoft Visual Studio Version Selector
。因此,经过一些研究,我发现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启动任务也会保持打开状态。因此,任何通过gradle启动的调用都会在某个特定环境中等待它完成。情节变浓......
答案 0 :(得分:0)
Gradle正在等待开始返回是我的猜测,请看这篇文章 - Run a background job from Gradle。在回答之后阅读评论,这是从Java开始的,所以如果有相同的& (在后台运行)for windows,它不会工作。
您也可以尝试将其包装在bat文件中,在后台的bat文件中执行您想要的操作,然后立即返回,以便gradle会很高兴。
希望这有帮助。