2016-11-03 50 views
2

我已經使用Node編寫了一個Electron應用程序,Electron Boilerplatephantom。在我的linux機器上,它對我來說工作得非常好,我將源代碼複製到了Windows 10,並使用npm start運行,並且一切順利。PhantomJS來自Windows上的節點

但是,當我嘗試使用npm run release使用樣板模塊構建應用程序時,情況會變得不那麼順暢。我可以安裝並打開應用程序,但是當我點擊激活幻像模塊的按鈕時,窗戶全白,沒有任何反應。我能用開發工具記錄一些錯誤。

首先,我有:

C:\...\dist\win-unpacked\resources\app.asar\node_modules\phantom\lib\phantom.js:361 
Uncaught (in promise) Error: Error reading from stdin: Error: write EPIPE(…) 

我做了一些研究類似的問題,即here,並且在我看來,這個問題開始的子進程,PhantomJS,與故宮模塊幻象。最初,我使用的是我在C#中編寫的WPF應用程序來啓動該過程,並且工作得很好。這讓我相信幻影模塊是罪魁禍首。

所以,我想換出故宮幻影模塊horseman,卻得到了類似的結果:

Unhandled rejection HeadlessError: Phantom immediately exited with: 4294967295 
    at ChildProcess.immediateExit (C:\...\dist\win-unpacked\resources\app.asar\node_modules\node-horseman\node_modules\node-phantom-simple\node-phantom-simple.js:153:23) 
    at ChildProcess.g (events.js:286:16) 
    at emitTwo (events.js:106:13) 
    at ChildProcess.emit (events.js:191:7) 
    at Process.ChildProcess._handle.onexit (internal/child_process.js:204:12) 
+0

https://en.wikipedia.org/wiki/File_URI_scheme – 2016-11-05 18:27:39

+1

@Igor有什麼特別的你看到錯誤,或者你是否建議幽靈模塊有一個不正確的URI? –

+1

可能Windows安全問題不允許運行未簽名的程序。 – Vaviloff

回答

1

這裏是在黑暗中拍攝。我不積極,這將解決你的問題,但這裏有雲:

GYP和錯過匹配的二進制文件

幻影和許多其他節點模塊使用,這將是上運行的特定操作系統生成的二進制文件。有時在您的npm日誌文件中,您會看到對node-gyp的引用。 Node-gyp只是幫助在節點模塊中構建本地附加組件。在構建二進制文件時,通常會根據(其中包括)三個主要參數(操作系統,CPU架構和執行安裝的節點版本)進行構建。

我認爲你需要重建phantomjs到Electron正在使用的節點版本。大多數情況下,您的機器上安裝的節點版本以及在Electron中運行的節點版本都不相同。 Electron盡最大努力跟上,但總是有一點滯後,因爲工作量和測試需要保持最新。

當您通過運行npm install phantom安裝幻像時,它將假定它需要安裝或構建您的機器正在使用的節點版本的二進制文件。然後,當您的Electron應用程序嘗試運行幻像時,它會嘗試調用節點版本的二進制文件。如果不存在,子進程立即退出並顯示錯誤。

如何解決

幸運的是,還有其他人在那裏已經想通了,如何解決這個問題,並創建了一個偉大的工具來幫助生成正確的二進制文件。

輸入electron-rebuild

https://github.com/electron/electron-rebuild

電子 - 重建可以在命令行中運行,它會重建所有的本土模塊電子版本您的項目使用。

要安裝:

npm install electron-prebuilt

要(在Windows)的使用:

.\node_modules\.bin\electron-rebuild.cmd

這應該足以把正確的二進制文件在正確的地方。

其他的想法

有時你可以使用使用稱爲節點預GYP依賴包。例如。 sqlite3的。有一個已知的問題,當我試圖重建我的Electron包時,我遇到了一個問題。基本上,爲了避免這個問題(如果你遇到它),只需將--pre-gyp-fix附加到上述命令。

切線對於那些誰碰上預GYP修復問題上的預GYP修復

一件事:如果一個或多個的依賴關係取決於需要的模塊之一pre-gyp-fix,那麼即使他們在Electron中運行,他們也會在錯誤的地方尋找二進制文件。所有GYP預二進制文件的存儲與此類似的文件夾中:

.\node_modules\sqlite3\lib\binding

在我目前的項目我這裏有三個文件夾,一個可以用於電子V1.4和兩個節點,V46和節點-V50。 (黑客警報)爲了讓sqlite3與我的其他依賴項一起工作,我複製在Electron-v1.4文件夾中找到的二進制文件,並將它放入兩個node-v *文件夾中。這種方式在Electron中運行時,即使在錯誤的位置上查找它們,所有依賴項也會運行正確的二進制文件。 (末黑客警報

結論

沒有辦法,我可以肯定這有什麼關係,你所看到的問題。但值得一試,看看它是否能解決您的問題。如果不是,那麼至少我希望我能幫助其他人遇到同樣的問題。