diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index de2e8413..947041be 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -288,12 +288,15 @@ jobs: # 分析服务 APTABASE_APP_KEY: ${{ secrets.APTABASE_APP_KEY }} working-directory: apps/desktop - run: pnpm run build && pnpm exec electron-builder --win --config electron-builder.yml -p never + run: pnpm run build:win - name: Verify native parser in packaged app (win x64) shell: bash run: node scripts/check-desktop-native.mjs win32-x64-msvc + - name: Verify packaged SQLite runtime (win x64) + run: node scripts/check-packaged-sqlite.mjs + - name: Upload Windows artifacts uses: actions/upload-artifact@v6 with: diff --git a/apps/desktop/electron-builder.yml b/apps/desktop/electron-builder.yml index d9601031..1ccf5970 100644 --- a/apps/desktop/electron-builder.yml +++ b/apps/desktop/electron-builder.yml @@ -50,6 +50,11 @@ asarUnpack: win: executableName: ChatLab target: nsis + # Windows 构建显式携带 ensure-native 生成的 Electron ABI binding,避免 + # electron-builder 在 workspace 中误判 appDir 时打入共享 Node ABI 产物。 + extraResources: + - from: native/better_sqlite3.node + to: native/better_sqlite3.node # NSIS 安装器配置 nsis: @@ -87,7 +92,7 @@ dmg: artifactName: ChatLab-${version}-${arch}.${ext} # 是否在构建之前重新编译原生模块。 -# better-sqlite3 非 NAPI,打包必须使用 Electron ABI:electron-builder 会在共享 -# node_modules 里原地重建(CI 一次性环境无影响)。本地 build:mac/build:win 通过 -# scripts/build-app.mjs 在打包结束后自动把共享绑定恢复为 Node ABI,保证 pnpm test 不被破坏。 +# macOS 继续由 electron-builder 重建共享 better-sqlite3;Windows 最终运行时使用 +# win.extraResources 中 desktop 自有的 Electron ABI binding。本地 build:mac/build:win +# 仍通过 scripts/build-app.mjs 恢复共享 Node ABI,保证 pnpm test 不被破坏。 npmRebuild: true diff --git a/scripts/check-packaged-sqlite.mjs b/scripts/check-packaged-sqlite.mjs index fd599cad..76a8482f 100644 --- a/scripts/check-packaged-sqlite.mjs +++ b/scripts/check-packaged-sqlite.mjs @@ -58,7 +58,7 @@ export function verifyPackagedSqlite({ }) if (result.status !== 0) { - throw new Error(`Packaged better-sqlite3 failed to load: ${safeChildError(result)}`) + throw new Error(`Packaged better-sqlite3 failed to load (${bindingPath}): ${safeChildError(result)}`) } let parsed @@ -75,8 +75,11 @@ export function verifyPackagedSqlite({ function main() { try { + const { bindingPath } = getPackagedSqlitePaths(defaultDistDir) const result = verifyPackagedSqlite() - console.log(`[check-packaged-sqlite] OK: Electron ABI ${result.abi}, SELECT 1 = ${result.value}`) + console.log( + `[check-packaged-sqlite] OK: binding ${bindingPath}; Electron ABI ${result.abi}; SELECT 1 = ${result.value}` + ) } catch (error) { console.error(`[check-packaged-sqlite] FAILED: ${error instanceof Error ? error.message : String(error)}`) process.exitCode = 1