Visual studio gradleexectask和Windows启动

Visual studio gradleexectask和Windows启动,visual-studio,gradle,cmd,Visual Studio,Gradle,Cmd,这个问题需要了解窗口的start命令的行为和自定义gradleexectask对它的处理 问题 为什么start以应用程序作为参数,只在gradle ExecTask中执行时才等待应用程序退出 解释 在命令行中,这将按预期工作(启动应用程序并返回,无需等待应用程序退出): 非常简单,它调用windows批处理脚本来设置环境,然后在Visual Studio中启动my.sln。工作正常,不用等待Visual Studio关闭。这就是我的gradle任务的目的 使用以下带start的gradle E

这个问题需要了解窗口的start命令的行为和自定义gradleexectask对它的处理

问题 为什么start以应用程序作为参数,只在gradle ExecTask中执行时才等待应用程序退出

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

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

使用以下带start的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高兴地报告
构建成功
,而Visual Studio保持打开状态

但是,我之所以说“有点”,是因为
start
实际上会忽略
executable
参数,并使用默认应用程序
Microsoft Visual Studio版本选择器打开
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平台工具集的不同而有所不同,但是…gradle坐在后台等待Visual Studio关闭

为什么?如何实现所有期望的行为?

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

我猜Gradle正在等待start的回归,请看这篇文章-。也请阅读回答后的注释,这是从Java开始的,因此如果windows有与&(在后台运行)相同的功能,它将不起作用

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


希望这能有所帮助。

正如我在帖子中所说,在gradle中,start命令以前是有效的。直到我在start命令中添加了更多参数之后,gradle才开始等待它返回。但是,新的start命令直接从命令行运行(如图中所示的第一个命令)不会等待。那么,这个命令的不同之处是什么,现在导致gradle等待?我没有使用start/wait命令。
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
}