我在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“忘记”生成的后台进程?
答案 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)