2016-02-17 37 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'環境變量的現有值,而不是始終設置它。 –