关于Electron原生模块编译的一点总结

Electron是PC端的跨平台开发框架,我们可以通过nodejs去调用其提供的各种底层API。但Electron为了保证自身文件体积较小和可持续开发,对API的数量进行了控制。好在,Electron同样支持Nodejs原生模块,只不过,需要用Electron的头文件进行重编译。

项目原本的npm库管理很乱,各级目录下都有package.json,且没有同步所有用到的,也没有通过package-lock.json进行版本号管理。因此,之前若想在新的设备,尤其非mac os上重新配下开发和打包环境,很难。。基本都是靠手动复制node_modules...

出于近期需要在linux上搭建一套开发环境的契机,对整个项目的架构进行重新梳理,重点就是npm库。因为换了操作系统,项目涉及到的Native库,需要重新编译。这里,我们以两个Native库为例,具体介绍下如何在不同系统下重编译Electron的Native库:canvassqlite3

配置npmrc

只是Electron官方文档给出的方案,通过在.npmrc文件中配置相关环境变量,帮助npm在下载Native模块时,自动下载其对应的Electron版本。

npm config ls -l

.npmrc在不同系统下的路径不一样,通过上面的命令找到其位置,手动添加一下内容:

// Electron
target=1.7.11
arch=x64
target_arch=x64
disturl=https://atom.io/download/electron
runtime=electron
build_from_source=true
//target_platform=darwin

target表示要编译的Electron版本,需要与你本地的Electron版本号一致。这里1.7.x,x有差异不影响,否则,可能会报错:

'xx.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 57. This version of Node.js requires
NODE_MODULE_VERSION 54. Please try re-compiling or re-installing

手动编译

Nodejs的Native模块,其根目录下都有binding.gyp这个文件,这是Chromium团队为nodejs跨平台设计的一种文件。通过node-gyp或者node-pre-gyp等nodejs命令工具,可以对Native模块进行重编译。

npm i -g node-gyp

使用node-gyp前,系统需要事先安装好以下环境:

Mac OS

  1. Xcode, 在Terminal上运行xcode-select --install
  2. Python v2.7, 一般已经默认安装

Windows

npm i -g production windows-build-tools

Linux

  1. C/C++工具,例如GCC
  2. python v2.7

node-gyp手动编译Electron模块:

cd node_modules/addon

node-gyp rebuild --target=1.7.11 --arch=x64 --target_platform=darwin --dist-url=https://atom.io/download/atom-shell

若配过.npmrc,直接node-gyp rebuild即可。

实践

简单的Native库,在配置了npmrc后,能直接下载成功,得到需要的.node文件。也有部分,除了Electron的Headers,还需要本地环境的支持。例如:canvassqlite3

  • canvas

    canvas是基于Cairo的图片处理库,该库的编译需要本地事先安装好以下环境:

    OS Command
    OS X Using Homebrew: brew install pkg-config cairo pango libpng jpeg giflib librsvg
    Ubuntu sudo apt-get install build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev
    Fedora sudo yum install gcc-c++ cairo-devel pango-devel libjpeg-turbo-devel giflib-devel
    Solaris pkgin install cairo pango pkg-config xproto renderproto kbproto xextproto
    Windows See the wiki

    以上环境安装完成后:

    cd node_modules/canvas

    node-gyp rebuild

    可以看到canvas/build/Release/下生成canvas.node文件

  • sqlite3

    sqlite3本身的编译不算复杂,麻烦的是building for sqlcipher。编译加密的sqlite3版本。

    MacOS

    npm install sqlite3 --build-from-source --sqlite_libname=sqlcipher --sqlite=`brew --prefix` --runtime=electron --target=1.7.11 --dist-url=https://atom.io/download/electron
    

    或者:

    cd node_modules/sqlite3

    node-gyp rebuild --sqlite_libname=sqlcipher --sqlite=`brew --prefix` --runtime=electron --target=1.7.11 --dist-url=https://atom.io/download/electron --module_path=../lib/binding/electron-v1.7-darwin-x64  --module_name=node-sqlite3
    

    macos上没有遇到什么问题,但在linux上折腾了很久。因为sqlite3加密也需要底层环境的各种支持,如基本的g++,sqlite编译需要的libsqlite3-devld模块需要的sqlcipher等等。这些问题因为没什么普适性,就不展开讲,解决办法也就是根据报错去Google。

总结

Nodejs的原生模块,Electron本身也有提供electron-rebuild这样的工具,也介绍了如何配置来实现Native模块的自动编译,目前还没有去尝试。考虑到一般情况下,是在一台机子上打包三个平台的安装包,终究是要在不同操作系统下去对Native模块重编译的,所以,掌握好node-gyp的手动编译更重要些。。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容