【问题标题】:Electron-packager: can not locate local db file after packingElectron-packager:打包后找不到本地数据库文件
【发布时间】:2017-08-11 12:28:04
【问题描述】:

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

项目文件夹架构

ma​​in.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文件,但系统显示找不到我的数据库文件。

尝试过的方法:

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

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

但是,在这样做之后,我既不能通过运行.exe 加载数据库文件,也不能通过运行npm start 来加载。

问题:

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

【问题讨论】:

  • 我认为您必须使用类似于在电子上加载 index.html 的路径。试试__dirname

标签: sqlite electron electron-packager


【解决方案1】:

运行.exe 时,当前目录可能不同,因此相对路径将不正确。正如您发现的那样,您需要组合一个完整路径,但您应该使用 app.getAppPath() 而不是 process.resourcesPath

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

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

【讨论】:

  • 我尝试了您的方法,将app.getAppPath() 添加到我的dbFile。此方法适用于 macOS,但不适用于 Windows。我不知道为什么...
  • 嗯,可能是因为 Windows 使用了不同的路径分隔符。我已经编辑让 path.join 填充路径分隔符。
  • 不知何故,它突然起作用了...无论如何,非常感谢您的帮助!它为我节省了很多时间!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2020-03-24
    • 1970-01-01
    • 2016-10-28
    • 2018-05-12
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2018-09-08
    • 2020-09-03
    相关资源
    最近更新 更多