之前开发桌面程序时遇到一个sqlite3的问题,本地启动没问题,打包后,mac和win系统不行,better-sqlite3打不进去,而且重新编译也不行,一直报错,后面经过多方面找文档和测试现在终于可以了
我自己用的版本
"better-sqlite3": "^9.6.0",
"electron": "21.3.4",
"electron-builder": "^25.1.8",
"electron-rebuild": "^3.2.9",
"electron-vite": "^4.0.0",
better-sqlite3.node版本准备
- 在src目录下新建resources文件夹

- 将下载的better-sqlite3.node放在对应的系统文件夹中

新增afterPack编译脚本
path.join需要提供完整的app资源路径,进行替换,mac和win是最终测试完成的,需要根据自己程序名称和路径调整
js
const fs = require('fs')
const path = require('path')
function copyFileSync(destDirName, destPath) {
const target = path.join(__dirname, `../resources/${destDirName}/better_sqlite3.node`)
fs.copyFileSync(target, destPath)
}
exports.default = function (context) {
const { appOutDir, outDir } = context
let destPath = null
if (context.packager.platform.nodeName === 'darwin') {
// 具体枚举参考文档:https://www.electron.build/app-builder-lib.enumeration.arch
if (context.arch === 1) {
// x64
// copyFileSync('darwin-x64', destPath)
// console.log('【darwin-x64】 better-sqlite3拷贝成功')
throw new Error('【darwin-x64】 当前平台暂不支持,请适配后打包')
return
} else if (context.arch === 3) {
destPath = path.join(
appOutDir,
'test.app',
'Contents',
'resources',
'app.asar.unpacked',
'node_modules',
'better-sqlite3',
'build',
'Release',
'better_sqlite3.node'
)
// arm64
copyFileSync('darwin-arm64', destPath)
console.log('【darwin-arm64】 better-sqlite3拷贝成功')
return
}
} else if (context.packager.platform.nodeName === 'win32') {
if (context.arch === 1) {
destPath = path.join(
appOutDir,
'resources',
'app.asar.unpacked',
'node_modules',
'better-sqlite3',
'build',
'Release',
'better_sqlite3.node'
)
// x64
copyFileSync('win32-x64', destPath)
console.log('【win32-x64】 better-sqlite3拷贝成功')
return
} else {
destPath = path.join(
appOutDir,
'resources',
'app.asar.unpacked',
'node_modules',
'better-sqlite3',
'build',
'Release',
'better_sqlite3.node'
)
// x32
copyFileSync('win32-x32', destPath)
console.log('【win32-x32 better-sqlite3拷贝成功')
return
}
} else if (context.packager.platform.nodeName === 'linux') {
// copyFileSync('linux-x64', destPath)
// console.log('【linux-x64】 better-sqlite3拷贝成功')
throw new Error('【linux-x64】】 当前平台暂不支持,请适配后打包')
return
}
throw new Error('当前平台暂不支持,请适配后打包')
}
electron-builder.yml 配置
配置需要将上面的脚步放在 afterPack:属性上, 其他的应该我没有别的改动
yml
appId: com.test.stock.app
productName: test
directories:
buildResources: build
files:
- '!**/.vscode/*'
- '!src/*'
- '!server/*'
- '!globel/*'
- '!electron.vite.config.{js,ts,mjs,cjs}'
- '!{.eslintcache,eslint.config.mjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}'
- '!{.env,.env.*,.npmrc,pnpm-lock.yaml}'
- '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}'
asarUnpack:
- resources/**
# 将脚本放在这
afterPack: './scripts/before-pack.js'
npmRebuild: false
win:
executableName: stock-sync-plugin
requestedExecutionLevel: requireAdministrator
signAndEditExecutable: true
#executableName: electron-app
target:
- target: nsis
# arch:
# - x64
# - ia32
icon: build/icon.ico
nsis:
oneClick: false
allowToChangeInstallationDirectory: true
createStartMenuShortcut: true # 创建开始菜单快捷方式
allowElevation: true # 一般情况下,此字段不会被直接使用,权限提升主要依赖于 perMachine 的设定。当perMachine为true,安装程序会请求管理员权限
deleteAppDataOnUninstall: true # 如果设置为 true,卸载程序将删除AppData中的所有程序数据
# shortcutName: Stock Sync Plugin # 快捷方式名称
artifactName: ${name}-${version}-setup.${ext}
shortcutName: ${productName}
uninstallDisplayName: ${productName}
createDesktopShortcut: always
mac:
entitlementsInherit: build/entitlements.mac.plist
extendInfo:
- NSCameraUsageDescription: Application requests access to the device's camera.
- NSMicrophoneUsageDescription: Application requests access to the device's microphone.
- NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder.
- NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder.
notarize: false
icon: build/icon.icns
# target:
# - target: default
# arch:
# - x64
# - arm64
dmg:
artifactName: ${name}-${version}.${ext}
linux:
target:
- AppImage
- snap
- deb
maintainer: electronjs.org
category: Utility
appImage:
artifactName: ${name}-${version}.${ext}
publish:
provider: generic
url: https://example.com/auto-updates
electronDownload:
mirror: https://npmmirror.com/mirrors/electron/
目录结构

效果控制台展示

