重建electron,node-gyp常用参数详解大全
发布于 作者:苏南大叔 来源:程序如此灵动~平时大家所使用的electron
,是已经预编译好的。但是一些特殊情况下,是需要对electron
的源码重新编译,以添加新的功能的。比如sqlite
或者ffi
等功能。这些功能的添加,都会触发electron
的重新编译,进而需要设置一些参数。编译参数的正确设置,会影响到最终的编译结果。
本文的关键词是:node-gyp
,但是可能存在着一些变形命令。但是,无论如何,最终一定会向命令行里面,传递这些参数:dist-url
/arch
/target
/python
/msvs_version
。
本文测试环境:win10
/node@10.15.1
/node-gyp@3.8.0
/electron@1.7.11
。
因为node-gyp
的正确执行,是需要正确安装python@2.7
和c++@2015
的。这个是所有一切操作的基础前提,所以,这里苏南大叔还是建议您:先查看一下下面的这个前置的环境安装篇的内容:
--dist-url
参数--dist-url
指的是下载header tarball
的地方,这个标准答案是:
--dist-url=https://atom.io/download/electron
但是这个标准答案中的url
,在国内是很难访问到的。所以,需要替换成国内的淘宝镜像地址:
--dist-url=https://npm.taobao.org/mirrors/atom-shell
苏南的大叔找到了2个淘宝的
npm
镜像地址:上述两个地址中,看上去第一条
/mirrors/electron
和标准答案最接近。但实际上,后面的/mirrors/atom-shell
才是正确答案。
--arch
这个arch
参数是比较邪门的,从历史的发展上来说,大多数情况下,这个值都应该是x64
。网上流行的教程里面,而且相关参数有两个,分别是:--arch
和--target_arch
这两个值,都应该设置为x64
。但是node-gyp
官方只有一个参数--arch
,所以--target_arch
这个参数,苏南大叔认为,可能是个历史参数的兼容罢了。
另外,还需要注意node
环境的arch
。否则的话,即使编译成功,但是运行的时候,也很有可能会碰到如下类似的错误:
ffi.Library Error: %1 is not a valid Win32 application
这个问题的解决方案就是:检查node
的arch
版本,需要为x64
版本。卸载当前的node
,然后去官网下载个x64
版本的node
吧。相关经验文字为:
--target
--target
指的是项目目录下的electron
的版本号,而不是全局的electron
版本号,当然也不是什么nodejs
的版本号。你可以通过执行下面这条命令,来查看确定这个值。
node_modules/.bin/electron -v
具体可以查看下面这个链接的内容:
--python
因为python2.7
加入了系统路径的话,这个--python
就不必设置了。如果设置,下面的是个例子:
--python = D:\Library\Python\Python27\python.exe
当然,您在npm config
里面设置一下python
的值,据说也是可以的。下面是个例子:
npm config set python D:\Library\Python\Python27\python.exe
这里唯一要注意的地方就是:python
的路径中,可能存在的空格问题。老生常谈,这里不做多说。老程序员都知道,这个万恶的空格,如何避免。
python
需要版本2.7
!目前来说,python3.7
是不行的!切记切记!不要做任何无谓的尝试!很多人栽倒在这个坑里面!各种奇形怪状的错误信息!
--msvs_version
--msvs_version
,以目前的情况来说,恒定设置为2015
字样即可,不过不排除将来会有变化的可能性。
--msvs_version = 2015
下面这个链接中,有更详细的描述信息:
更多参数
这里重建electron
的方式方案很多,但是都包含着上述几个参数。那么,请重点注意好这几个参数,就可以了。如果您还使用了其他参数,可以点击这么这个连接,查看更详细的说明:
结语
更多node-gyp
的经验文字,请点击苏南大叔的博客文章:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
--target 官网说的是 node version, 而你这里说的是 electron version,我试了你说的是对的,所以好奇官网是写错了还是我理解错了
那也许是我说的是对的?
苏南老师,再向你请教一个问题,就是我用FFI调用dll,在本地开发打包后都是没问题的,但是将打的包发给别人安装就报错:electron ffi Dynamic linking Error: win32 Error126 at new Dynamiclibray;查了dll路径是对的,请问老师这是什么情况啊,谢谢!
老师,您好,请教一下,进入ffi模块执行重新编译的命令,并注入参数
node-gyp rebuild -target=3.0.0 -arch=x64 -dist-url=https://atom.io/download/atom-shell
报错:
D:\ynrrc\workspace\ynrcc-ebank-desktop-app\node_modules\ffi>if not defined npm_config_node_gyp (node "C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin\\..\..\node_mod
ules\node-gyp\bin\node-gyp.js" rebuild -target=3.0.0 -arch=x64 -dist-url=https://atom.io/download/atom-shell ) else (node "" rebuild -target=3.0.0 -arch=x64 -dist-url=https://atom.io/download/atom-shell
)
internal/modules/cjs/loader.js:613
throw err;
^
Error: Cannot find module 'C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\node_modules\node-gyp\bin\node-gyp.js'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:611:15)
at Function.Module._load (internal/modules/cjs/loader.js:537:25)
at Function.Module.runMain (internal/modules/cjs/loader.js:801:12)
at executeUserCode (internal/bootstrap/node.js:526:15)
at startMainThreadExecution (internal/bootstrap/node.js:439:3)
我的npm config 如下:
C:\Users\13533>npm config get
; cli configs
metrics-registry = "https://registry.npmjs.org/"
scope = ""
user-agent = "npm/6.10.1 node/v11.8.0 win32 ia32"
; userconfig C:\Users\13533\.npmrc
node_gyp = "node C:\\Users\\13533\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js"
; globalconfig C:\Users\13533\AppData\Roaming\npm\etc\npmrc
msvs_version = "2015"
python = "C:\\Users\\13533\\.windows-build-tools\\python27\\python.exe"
; builtin config undefined
prefix = "C:\\Users\\13533\\AppData\\Roaming\\npm"
; node bin location = C:\Program Files (x86)\nodejs\node.exe
; cwd = C:\Users\13533
; HOME = C:\Users\13533
; "npm config ls -l" to show all defaults.
windows-build-tools@4.0.0安装成功
node 11.8.0 32位
npm 6.10.1
Electron 3.0.0 32位
win 10
各种尝试了都无法解决希望老师能帮助一下谢谢!