【问题标题】:Run main process as child_process将主进程作为 child_process 运行
【发布时间】:2016-05-28 20:49:33
【问题描述】:

我无法让child_process 与 Atom Electron 一起工作。首先,我使用的是预编译的二进制应用程序,你可以从 Electron 的网站下载:

  • 我在 Mac OS X 上使用通常的预编译二进制文件。
  • myapp.app/Contents/Resources 中,我按照说明制作了一个文件夹应用程序。
  • 我在其中添加了一个简短的package.json,将index.js 设置为主脚本。

现在,如果我向index.js 添加以下 sn-p:

'use strict';

var electron = require('electron');
var app = electron.app;

const BrowserWindow = electron.BrowserWindow;

var mainWindow;

function createWindow () {
  mainWindow = new BrowserWindow({width: 800, height: 600});
  mainWindow.loadURL('file://' + __dirname + '/index.html');
  mainWindow.webContents.openDevTools();
  mainWindow.on('closed', function()
  {
    mainWindow = null;
  });
}

app.on('ready', createWindow);

app.on('window-all-closed', function () {
  if (process.platform !== 'darwin')
  {
    app.quit();
  }
});

app.on('activate', function () {
  if (mainWindow === null)
  {
    createWindow();
  }
});

(这基本上是让事情正常工作的示例代码)一切正常。我得到了窗口,我可以让它做任何事情。

现在,出于与更新相关的原因,我需要稍微改变这个范式。我需要的是能够从 index.js 执行几项任务 无需进行任何 gui 操作(它应该是某种守护进程),然后启动一些 child.js 脚本为来自index.jschild_processchild.js 应该可以打开窗口和其他所有东西。

所以这是我天真的尝试。我只是将上面的示例 sn-p 剪切并粘贴到 child.js 中,然后将 index.js 编辑为以下内容:

var child_process = require('child_process');
var my_child = child_process.fork(__dirname + '/child.js');

非常少,对吧?希望它会起作用,但它没有。当我双击我漂亮的应用程序时,什么也没有发生。我敢打赌,我做错了一件微不足道的事情,但我不知道是什么。

更新 1 我将它从我的包中移出,以便获得 console.logs。 child.jsrequire('electron') 处因错误而死:似乎无法找到它。

更新 2:我在 child.js 中列出了环境变量,并注意到了 ATOM_SHELL_INTERNAL_RUN_AS_NODE = 1。我想我应该把它转为0,但没有任何改变。

【问题讨论】:

    标签: node.js child-process electron


    【解决方案1】:

    在 Electron 中,child_process.fork() 将生成具有 ATOM_SHELL_INTERNAL_RUN_AS_NODE 环境变量集的子进程,这意味着子进程中没有可用的 Chromium 功能(因此没有 Electron 内置模块),您将得到的只是vanilla Node 运行时加上一个可以在 ASAR 文件中读取的补丁fs。如果您查看child_process.fork() 的代码,您会发现无法覆盖ATOM_SHELL_INTERNAL_RUN_AS_NODE 的值。如果可以,请改用child_process.spawn(),否则我猜你可以尝试打开一个问题并询问 Electron 团队是否愿意修改当前行为。

    【讨论】:

    • 生成的进程是否应该在分离模式下运行?让index.jschild.js 互相交谈对我来说很重要。
    • 老实说,我对分离进程的生成并不太熟悉,尽管这似乎会阻止父子进程通过 stdio 管道进行通信。我建议打开一个问题来更改 child_process.fork() 以尊重 ATOM_SHELL_INTERNAL_RUN_AS_NODE 环境变量的现有值,而不是总是设置它。
    猜你喜欢
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 2020-07-08
    • 2012-12-03
    • 2011-08-25
    • 1970-01-01
    • 2014-08-30
    • 2021-08-13
    相关资源
    最近更新 更多