2016-11-03 44 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中运行时,即使在错误的位置上查找它们,所有依赖项也会运行正确的二进制文件。 (末黑客警报

结论

没有办法,我可以肯定这有什么关系,你所看到的问题。但值得一试,看看它是否能解决您的问题。如果不是,那么至少我希望我能帮助其他人遇到同样的问题。