關於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的手動編譯更重要些。。

相關文章
相關標籤/搜索