美文网首页
关于Electron原生模块编译的一点总结

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

作者: charles0427 | 来源:发表于2019-01-08 12:01 被阅读136次

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

    相关文章

      网友评论

          本文标题:关于Electron原生模块编译的一点总结

          本文链接:https://www.haomeiwen.com/subject/ksyvrqtx.html