2026-08-21 11:03:11 +08:00
|
|
|
|
"use strict";
|
|
|
|
|
|
// 開發時直接跑資料夾;打包後程式碼會在 resources/app.asar 裡面。
|
|
|
|
|
|
// 有些東西不能待在 asar 內:
|
|
|
|
|
|
// - hook/claude-pet-hook.js:Claude Code 會用 `node <路徑>` 執行它,node 讀不到 asar 內的檔案
|
|
|
|
|
|
// - pets/:使用者要能自己丟寵物進去,選單也要能開這個資料夾
|
|
|
|
|
|
// 這兩個在 build 設定裡以 asarUnpack 解開到 resources/app.asar.unpacked,路徑要跟著換過去。
|
|
|
|
|
|
const path = require("node:path");
|
|
|
|
|
|
|
|
|
|
|
|
const PACKED = `${path.sep}app.asar${path.sep}`;
|
|
|
|
|
|
const UNPACKED = `${path.sep}app.asar.unpacked${path.sep}`;
|
|
|
|
|
|
|
|
|
|
|
|
function unpacked(p) {
|
|
|
|
|
|
return p.includes(PACKED) ? p.replace(PACKED, UNPACKED) : p;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 在 Electron 裡跑,而且不是 `electron .` 的開發模式(開發模式 process.defaultApp 為 true)
|
|
|
|
|
|
function isPackaged() {
|
|
|
|
|
|
return Boolean(process.versions.electron) && !process.defaultApp;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-08-21 14:11:20 +08:00
|
|
|
|
// portable 單檔版:NSIS 外殼每次啟動都把整包解到 %TEMP%,程式結束後又整個刪掉,
|
|
|
|
|
|
// 所以「程式本身的位置」是暫時的,只有這兩個環境變數指得到那顆 exe 真正待的地方。
|
|
|
|
|
|
function portableExe() {
|
|
|
|
|
|
return process.env.PORTABLE_EXECUTABLE_FILE || null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function portableDir() {
|
|
|
|
|
|
return process.env.PORTABLE_EXECUTABLE_DIR || null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function isPortable() {
|
|
|
|
|
|
return Boolean(portableExe());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = { unpacked, isPackaged, portableExe, portableDir, isPortable };
|