2016-02-17 36 views
3

我在使用Atom Electron时遇到问题child_process。首先,我使用了预编译的二进制应用程序,你可以从电子的网站上下载:运行主进程为child_process

  • 我使用Mac OS X上常用的预编译的二进制
  • myapp.app/Contents/Resources我做了一个文件夹如上所述。
  • 我在其中添加了一个简短的package.json,将index.js设置为主脚本。

现在,如果我加入index.js下面的代码片段:

'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操作(它应该是某种守护进程),然后从index.js开始child.js脚本作为child_processchild.js应该可以打开窗户,其余的都可以。

所以这里是我的天真尝试。我只是剪切和粘贴的示例代码片段以上child.js,然后进行编辑index.js到以下几点:

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

相当小的,对不对?希望它能工作,但事实并非如此。当我双击我的漂亮的应用程序,没有任何反应。我敢打赌,我以微不足道的方式做错了什么,但我无法分辨出什么。

更新1我把它从我的包里拿出来,这样我就可以得到console.log s。 child.js死于错误require('electron'):它似乎无法找到它。

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

回答

0

In 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团队是否愿意修改当前行为。

+0

生成的进程是否应以分离模式运行?使我的'index.js'和'child.js'互相交谈对我来说很重要。 –

+0

说实话,我并不太熟悉分离过程的产卵,尽管它似乎会阻止父母和孩子通过stdio管道进行交流。我建议打开一个问题来改变'child_process.fork()'以尊重'ATOM_SHELL_INTERNAL_RUN_AS_NODE'环境变量的现有值,而不是始终设置它。 –