代码之家  ›  专栏  ›  技术社区  ›  ThePainnn

在vscode扩展内执行电子应用程序

  •  3
  • ThePainnn  · 技术社区  · 6 年前

    我正在开发一个vscode扩展,它需要执行一个外部程序来完成不同的任务如果外部程序不接受参数:ui pop。带命令行参数:命令行模式我用electron构建了这个应用程序,它在调试和在命令行上用electron启动时都能很好地工作它被打包到windows上的一个.exe文件中,在命令行或直接双击命令行中也同样有效。

    当我试图用child_process.execfile从我的vscode扩展执行它时,事情变得很糟糕。我只放置了exe路径,进程将保留在任务监视器(没有ui)中。我放了一些命令行参数:node reply:bad选项。我试着在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");
          });
    

    注意:例如,使用C#中的Visual Studio构建一个普通的可执行代码时,如果我使用exec启动它,同样的代码也能很好地工作我们只想在JS中使用electron,这样团队就有宾至如归的感觉。

    2 回复  |  直到 6 年前
        1
  •  3
  •   IceLee    6 年前

    我遇到了同样的问题。我找了很长时间的解决办法,终于找到了 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
        }
    },
    ...
    ...
    

    希望能成功!

        2
  •  0
  •   Jens Habegger    6 年前

    有两件事可以帮助你:

    • 将命令行选项传递到打包的电子应用程序时,需要附加 -- 在你的其他选择之前。这向electron发出信号,表明这些命令行选项实际上是为您的应用程序准备的,而不是electron/Node可执行文件

      exampleApp.exe -- --yourOption1

    • 第二,您正在尝试使用childprocess.execfile()顶部生成一个同步进程。execFile()还有一些已知的安全问题,这就是您应该避免它的原因相反,使用异步childprocess.spawn()甚至childprocess.fork()来启用进程间通信。 Here is an excellent article 这将更详细地讨论儿童处理的不同方法。