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

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

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

出于近期须要在linux上搭建一套开发环境的契机,对整个项目的架构进行从新梳理,重点就是npm库。由于换了操做系统,项目涉及到的Native库,须要从新编译。linux

配置npmrc

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

npm config ls -lgit

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

// 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有差别不影响,不然,可能会报错:sql

'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模块进行重编译。shell

npm i -g node-gypmacos

使用node-gyp前,系统须要事先安装好如下环境:npm

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的手动编译更重要些。。

相关文章
相关标签/搜索