【问题标题】:Execute an electron app within vscode extension在 vscode 扩展中执行一个电子应用程序
【发布时间】:2018-12-27 23:10:16
【问题描述】:

我正在开发一个 vscode 扩展,它需要执行一个外部程序来完成不同的任务。如果外部程序不带参数:UI 弹出。使用 cmd 行参数:cmd 行模式。我已经使用电子构建了这个应用程序,它在调试和在 cmd 行上使用电子启动它时运行良好。它在 Windows 上被打包成 .exe,在 cmd 行或直接双击它也同样有效。

当我尝试使用 child_process.execFile 从我的 vscode 扩展程序执行它时,事情变得很糟糕。我只是放了exe路径,进程停留在任务监视器中(无UI)。我放了一些命令行参数:节点回复:错误选项。我尝试在 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 启动它,则效果很好。我们只是想将 Electron 与 JS 结合使用,让团队有宾至如归的感觉。

【问题讨论】:

  • pathToExec 是否包含空格?如果您将shell: true 添加到exec 选项,这是否有效?
  • 我的电脑上没有空间(以为我无法保证客户端将使用的路径)。我已经尝试使用 shell 执行到“cmd.exe”。结果相同。奇怪的是,当我尝试使用“electron main.js”(所以没有打包的 exe)运行它时,它可以工作但它崩溃到“app.on”,告诉我应用程序未定义(const {app} = require('electron')) .这当然只发生在 vs 代码扩展中。

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


【解决方案1】:

我也遇到了同样的问题,找了半天解决办法,终于找到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
    }
},
...
...

希望它可以工作!

【讨论】:

  • 当我切换到 C# 解决方案时,还没有时间尝试它。会尽快通知您。
  • 天啊...它的工作原理! (抱歉回复晚了,最近很忙!)
  • 该死,我花了一段时间才发现我的应用程序无法启动,因为它是一个 Electron 应用程序。我最终通过了一个空的环境:spawn(cmd, args, {env: {}})
  • 更新:不要像我上面说的那样只传递一个空字典,它在 Linux 上不起作用。
【解决方案2】:

两件事可以帮助你:

  • 当您将命令行选项传递给打包的 Electron 应用程序时,您需要在任何其他选项之前附加 --。这向 electron 发出信号,这些命令行选项实际上是针对您的应用程序的,而不是 Electron/Node 可执行文件

    exampleApp.exe -- --yourOption1

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

【讨论】:

  • 是的,我确实读过那篇文章。问题是我尝试了所有可能的功能:exec、execFile、spawn 和 fork。它们都不起作用。顺便说一句,感谢您的“--”评论,这至少应该澄清为什么我有时会选择“错误的选择”。应用程序仍然没有运行(或在没有 UI 的后台运行)。
  • 你有从 VS Code 扩展生成另一个 Electron 应用程序的优先权吗?我没有编写 VS 代码扩展的经验,但是.. 你知道,你已经在一个 Electron 实例中,为什么还要生成另一个实例?
  • 没有第一次这样做。这主要是因为我需要在 vscode 中生成一个包含表单、输入、文本区域的更复杂的 UI,而我没有看到在扩展中轻松做到这一点的方法。
  • 刚刚在 C# .net 中做了一个等价物。完美运行。电子有些东西我不明白:(
  • 那么,现在可以从命令行调用打包的可执行文件了吗?尝试从单独的 Node.js 进程中调用它怎么样?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-10
    • 2021-06-29
    • 2019-10-19
    • 2017-01-04
    • 1970-01-01
    • 2022-12-18
    • 2013-11-23
    • 1970-01-01
    相关资源
    最近更新 更多