62m*_*mkv 1 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"
}
Run Code Online (Sandbox Code Playgroud)
我想background从VS代码运行任务,所以我这样设置tasks.json(省略了一些行):
"command": "npm",
"args": [],
"isShellCommand": true,
"showOutput": "always",
"suppressTaskName": true,
"tasks": [
{
"taskName": "background",
"args": ["run", "background"]
}
]
Run Code Online (Sandbox Code Playgroud)
如果我npm run background从远程管理器运行,则会启动2个新的控制台窗口,然后我将返回到远程.但是,当我在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代码"忘记"生成的后台进程?
我发现的一个棘手的方法如下:
{
"windows": { "command": "powershell" },
"suppressTaskName": true,
"tasks": [
{"taskName": "test",
"args": [ "(New-Object -ComObject WScript.Shell).Run('notepad', 1, $false)" ] }
}
Run Code Online (Sandbox Code Playgroud)
这将开始notepad.exe并且它将与VS Code实例完全分离(例如,您可以再次启动相同的任务,并且它不会抱怨).
VS Code使用标准node.js child_process模块来控制子进程(请参阅processes.ts参考资料),默认情况下会监视子进程'管道'状态.管道是由任何start'ed流程实例派生的,这就是VS Code如何检测整个流程子树状态(这就是为什么你的start技巧在这里不起作用).
完全分离子进程的最简单方法之一是使用WScript.ShellCOM对象,这就是我选择PowerShell实现的原因.使用cscript和一个小脚本文件,或者使用标志调用Win32 API函数的小帮助程序,可以实现相同CreateProcess的目的DETACHED_PROCESS.
专业提示™:更换1同0在一个隐藏的窗口中运行的过程!
| 归档时间: |
|
| 查看次数: |
2013 次 |
| 最近记录: |