Electron-packager:打包后无法找到本地db文件

时间:2017-03-20 09:32:52

标签: sqlite electron electron-packager

背景 在我的应用程序中,我有一个名为example.db的本地数据库文件,由main.js读取。我的main.js程序的项目结构和部分内容如下所示。

项目文件夹架构

enter image description here

main.js

const {
  app,
  BrowserWindow,
  dialog,
  Menu
} = require('electron')

const fs = require('fs')
const path = require('path')

const sqlite3 = require('sqlite3').verbose()

// load dataBase
let dbFile = 'app/db/example.db'
const db = new sqlite3.Database(dbFile)

的package.json

{
  "name": "Example",
  "version": "1.0.0",
  "description": "",
  "main": "./app/main.js",
  "scripts": {
    "postinstall": "install-app-deps",
    "start": "electron ."
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "electron-builder": "^15.5.1",
    "electron-prebuilt": "^1.4",
    "electron-rebuild": "^1.5.7",
    "electron-packager": "^8.1.0"
  },
  "dependencies": {
    "jquery": "^3.1.1",
    "sqlite3": "^3.1.8"
  }
}

问题:

我可以通过运行npm start成功加载数据库文件,但是,通过在Example文件夹下运行以下命令行将我的程序成功打包到Windows平台后:

node_modules/.bin/electron-packager --platform=win32 --arch=x64 .

我运行了.exe文件,但系统显示无法找到我的数据库文件。

enter image description here

尝试过的方法:

我尝试使用main.js修改process.resourscesPath中的db文件路径,如下所示:

// load dataBase
let dbFile = path.join(process.resourcesPath, '/app/db/example.db')
const db = new sqlite3.Database(dbFile)

但是,在执行此操作后,我既不能加载运行.exe的数据库文件,也不能通过运行npm start来加载。

问题:

我想知道存储我的数据库文件的正确方法是什么,以及如何在我的后端程序中编写它的路径(本例中为main.js)。感谢。

2 个答案:

答案 0 :(得分:3)

运行.exe时,当前目录可能不同,因此相对路径不正确。如您所知,您需要整理完整路径,而不是process.resourcesPath,您应该使用app.getAppPath()

let dbFile = path.join(app.getAppPath(), 'app', 'db', 'example.db')

这应该给出数据库文件的正确路径。您可能遇到的另一个问题是.exe通常会以Asar格式打包,这样可以提供读取权限但不能进行写入权限。因此,如果您需要写入数据库,最好将其放在其他位置。 electron.app.getPath(name) API提供了许多路径,因此您可以使用app.getPath("userData")获取为每个用户的应用程序数据提供的路径。在这种情况下,您的应用程序必须在该位置创建数据库文件。

答案 1 :(得分:0)

我做了几次尝试,唯一对我有用的是用数据库文件替换 app.asar 文件,即

const { app } = window.require('electron').remote;
const appPath = app.getAppPath().replace("app.asar", "db_name.sqlite");