在vscode扩展中执行电子应用

时间:2018-07-19 17:47:27

标签: node.js visual-studio-code electron

我正在研究vscode扩展,它需要执行一个外部程序来执行不同的任务。如果外部程序不接受任何参数:UI pop。使用cmd行参数:cmd行模式。我已经使用电子构建了这个应用程序,它在调试以及在cmd线上用电子启动它时都能很好地工作。它被打包到Windows上的.exe中,并且在cmd行中效果很好,或者直接双击它即可。

当我尝试使用child_process.execFile从vscode扩展名执行它时,情况变得很糟。我只放置了exe路径,该过程停留在任务监视器中(没有UI)。我把一些cmd行参数:节点答复:错误的选择。我尝试在tools.bat文件中运行它,所以我改称为bat。也不起作用。我尝试使用fork,spawn,exec。行为相同。

启动代码:

      const childProcess = child.execFile(pathToExec, [], { cwd: execDir, env: process.env, });

      childProcess.stdout.on('data', (data) => {
        console.log(data.toString());
      });
      childProcess.stderr.on('data', (data) => {
        console.log(data.toString());
      });
      childProcess.on("exit", () => {
        console.log("exit");
      });

注意:例如,如果我使用exec启动它,则具有在Visual Studio中使用C#进行普通可执行构建的相同代码,效果很好。我们只是想将电子与JS结合使用,以使团队感到宾至如归。

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。我搜索了很长时间的解决方案,最后发现this page,它表明这是vscode进程环境的问题。因此,您应该通过以下方式创建新进程:

var spawn_env = JSON.parse(JSON.stringify(process.env));
console.log(process.env);
delete spawn_env.ATOM_SHELL_INTERNAL_RUN_AS_NODE;
delete spawn_env.ELECTRON_RUN_AS_NODE;
var spawn = require('child_process').spawn;
spawn(cmd,[],{env:spawn_env,detached:true});

如果不起作用,请在扩展项目中修改.vscode/tasks.json

"version":"your version"
"options": {
    "env":{//add this element
    }
},
...
...

希望它可以工作!

答案 1 :(得分:0)

可以帮助您的两件事:

  • 当您将命令行选项传递给打包的Electron应用程序时,您需要在其他任何选项之前附加user.dir。这表明电子提示这些命令行选项实际上是您的应用程序所需的,而不是Electron / Node可执行文件

    --

  • 其次,您尝试使用childProcess.execFile()顶部生成一个同步进程。 childProcess.execFile()也有一些已知的安全问题,这就是为什么您应该避免它。而是,使用异步childProcess.spawn()或什至childProcess.fork()来启用进程间通信。 Here is an excellent article详细介绍了有关childProcess的不同方法。

答案 2 :(得分:0)

试试vscode.env.openExternal(vscode.Uri.file(filePath)); 但是我在 Linux (VSCode extension can't start external Electron application) 中遇到了问题。