Gradle ExecTask和Windows启动

时间:2015-04-28 21:28:38

标签: visual-studio gradle cmd

这个问题需要了解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启动的调用都会在某个特定环境中等待它完成。情节变浓......

1 个答案:

答案 0 :(得分:0)

Gradle正在等待开始返回是我的猜测,请看这篇文章 - Run a background job from Gradle。在回答之后阅读评论,这是从Java开始的,所以如果有相同的& (在后台运行)for windows,它不会工作。

您也可以尝试将其包装在bat文件中,在后台的bat文件中执行您想要的操作,然后立即返回,以便gradle会很高兴。

希望这有帮助。