如何在Windows下的VS Code中运行后台任务?

时间:2016-12-12 16:34:59

标签: windows npm visual-studio-code

我在package.json文件中设置了一些脚本,应该在后台运行,比如

"scripts": {
  "babel-watch": "babel client -d _tmp/babel -w",
  "server": "node server.js",
  "background": "start npm run babel-watch && start npm run server"
}

我想从VS代码运行background任务,所以我设置tasks.json这样(省略了一些行):

"command": "npm",
"args": [],
"isShellCommand": true,
"showOutput": "always",
"suppressTaskName": true,
"tasks": [
   {
        "taskName": "background",
        "args": ["run", "background"]
    }
]

如果我从远程管理器运行npm run background,则会启动2个新的控制台窗口,然后我将返回到Far。但是,当我在VS Code中运行它时(使用task background,启动了2个新的控制台窗口,但是VS代码等待直到任务完成,然后它才允许我执行另一个任务(错误)显示:There is an active running task right now. Terminate it first before executing another task.(我给了一个选项“终止运行任务”,这只会导致错误The launched process doesn't exist anymore. If the task spawned background tasks exiting VS Code might result in orphaned processes.)。就像VS Code监视所有已启动的子进程一样,或者像这样。

有没有办法绕过这种行为并让VS Code“忘记”生成的后台进程?

2 个答案:

答案 0 :(得分:5)

我发现的一种棘手的方式如下:

{
  "windows": { "command": "powershell" },
  "suppressTaskName": true,
  "tasks": [
    {"taskName": "test",
     "args": [ "(New-Object -ComObject WScript.Shell).Run('notepad', 1, $false)" ] }
}

这将启动notepad.exe并且它将与VS Code实例完全分开(例如,您可以再次启动相同的任务,并且不会抱怨)。

为什么会起作用?

VS Code使用标准node.js child_process模块来控制子进程(see processes.ts),默认情况下会监视子进程'管道'状态。管道由任何start'ed流程实例派生,这就是VS代码检测整个流程子树状态的原因(这就是为什么你的start技巧在这里不起作用的原因。)

完全分离子进程的最简单方法之一是使用WScript.Shell COM对象,这就是我选择PowerShell实现的原因。使用cscript和一个小脚本文件,或使用CreateProcess标志调用Win32 API函数DETACHED_PROCESS的小帮助程序,可以实现相同的效果。

Pro Tip™:将1替换为0,以便在隐藏窗口中运行该过程!

答案 1 :(得分:1)

您现在无法同时运行多个任务。这是一个限制。

请参阅this issue以跟踪此字段的任何进展。

如果您阅读“当前限制”部分,第一部分明确表示我们现在一次只能运行一个任务。