2016年1月12日 星期二

在 Electron 裡使用 node_sqlite3

這幾天工作需要,所以需要在我們的 Electron 專案中使用 sqlite3,但是當程式跑起來需要用到 sqlite 的時候,卻發生找不到 module 的情況。

錯誤訊息如下: 
Error: Cannot find module 'C:\Users\hialan\electron-app\node_modules\
                       sqlite3\lib\binding\node-v47-win32-x64\node_sqlite3.node'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:289:25)

這是因為 electron 嘗試要去找 node_modules\sqlite3\lib\binding\node-v47-win32-x64 但是我們安裝下來的 sqlite 卻只有 node_modules\sqlite3\lib\binding\node-v46-win32-x64,因此就找不到 module 摟。

後來找到了這一篇文章,照著的說明就可以成功的在 windows 以及 mac 上重新編譯 node_sqlite3 正常執行了。以下將步驟節錄在此。

依照 electron 的文件,node-gyp 可以幫助我們重新編譯 module。
如果是 windows ,要記得安裝編譯器,可以參考這篇文章 在 windows 安裝 electron-prebuilt

主要的指令為
$ cd node_modules/sqlite3 && npm run prepublish 
$ node-gyp configure --module_name=node_sqlite3 --module_path=../lib/binding/node-v47-win32-x64 
$ node-gyp rebuild --target=0.36.2 --arch=x64 --target_platform=win32 --dist-url=https://atom.io/download/atom-shell --module_name=node_sqlite3 --module_path=../lib/binding/node-v47-win32-x64

  • --target 是我們 electron 的版本,目前我用的是 0.36.2
    • 可以用 ./node_modules/.bin/electron -v 看到你的版本
  • --module_path 是 electron 要找的路徑
  • --target_platform 是你的作業系統
    • Windows 為 win32
    • Mac 為 darwin
  •  --arch 為你的 CPU 架構 
target_platform 還有 arch 可以用這個指令拿到
$ npm config get user-agent
npm/2.14.12 node/v4.2.4 win32 x64

第三個是 target_platform, 第四個是 arch

把他合成一行加入我們的 package.json 的 script ,變成

"scripts": {
  "rebuild-sqlite3-win32": "cd node_modules/sqlite3 && npm run prepublish && node-gyp configure --module_name=node_sqlite3 --module_path=../lib/binding/node-v47-win32-x64 && node-gyp rebuild --target=0.36.2 --arch=x64 --target_platform=win32 --dist-url=https://atom.io/download/atom-shell --module_name=node_sqlite3 --module_path=../lib/binding/node-v47-win32-x64",
  "rebuild-sqlite3-darwin": "cd node_modules/sqlite3 && npm run prepublish && node-gyp configure --module_name=node_sqlite3 --module_path=../lib/binding/node-v47-darwin-x64 && node-gyp rebuild --target=0.36.2 --arch=x64 --target_platform=darwin --dist-url=https://atom.io/download/atom-shell --module_name=node_sqlite3 --module_path=../lib/binding/node-v47-darwin-x64"
}

就可以
  • 編譯 windows: npm run rebuild-sqlite3-win32 
  • 編譯 mac: npm run rebuild-sqlite3-darwin
參考資料

沒有留言:

張貼留言