diff --git a/main.js b/main.js index b8ba78b..d75e341 100644 --- a/main.js +++ b/main.js @@ -106,11 +106,7 @@ function setupProductionPath() { // 在初始化管理器之前设置PATH setupProductionPath(); -// 设置用户数据目录环境变量,供Python脚本使用 -process.env.ELECTRON_USER_DATA = app.getPath('userData'); -logger.info('设置用户数据目录环境变量', { - ELECTRON_USER_DATA: process.env.ELECTRON_USER_DATA -}); +// 用户数据目录环境变量将在 app ready 后设置 // 初始化管理器 const environmentManager = new EnvironmentManager(); @@ -125,19 +121,24 @@ const hotkeyManager = new HotkeyManager(); const dataDirectory = environmentManager.ensureDataDirectory(); databaseManager.initialize(dataDirectory); -// 使用所有管理器初始化IPC处理器 -const ipcHandlers = new IPCHandlers({ - environmentManager, - databaseManager, - clipboardManager, - funasrManager, - windowManager, - hotkeyManager, - logger, // 传递logger实例 -}); +// IPC处理器将在 app ready 后初始化 +let ipcHandlers = null; // 主应用启动函数 async function startApp() { + // 在 app ready 后初始化 IPC 处理器 + if (!ipcHandlers) { + ipcHandlers = new IPCHandlers({ + environmentManager, + databaseManager, + clipboardManager, + funasrManager, + windowManager, + hotkeyManager, + logger, + }); + } + logger.info('应用启动开始', { nodeEnv: process.env.NODE_ENV, platform: process.platform, @@ -210,6 +211,11 @@ async function startApp() { // 应用事件处理器 app.whenReady().then(() => { + // 设置用户数据目录环境变量,供Python脚本使用 + process.env.ELECTRON_USER_DATA = app.getPath('userData'); + logger.info('设置用户数据目录环境变量', { + ELECTRON_USER_DATA: process.env.ELECTRON_USER_DATA + }); startApp(); }); diff --git a/package.json b/package.json index 8f4fdf7..bc3a147 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "scripts": { "start": "electron .", "dev": "concurrently -k -r \"npm:dev:renderer\" \"npm:dev:main\"", - "dev:main": "cross-env NODE_ENV=development electron . --dev", + "dev:main": "cross-env NODE_ENV=development node start-electron.js --dev", "dev:renderer": "cd src && vite", "build": "cd src && vite build && cd .. && electron-builder", "postinstall": "electron-builder install-app-deps", @@ -56,7 +56,7 @@ "autoprefixer": "^10.4.21", "concurrently": "^8.2.2", "cross-env": "^10.0.0", - "electron": "36.5.0", + "electron": "^31.7.7", "electron-builder": "^24.6.4", "eslint": "^9.25.0", "eslint-plugin-react-hooks": "^5.2.0", @@ -77,7 +77,7 @@ "@radix-ui/react-tabs": "^1.1.12", "asynckit": "^0.4.0", "axios": "^1.6.0", - "better-sqlite3": "11.10.0", + "better-sqlite3": "^11.10.0", "bindings": "^1.5.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -158,4 +158,4 @@ "category": "Office" } } -} \ No newline at end of file +} diff --git a/src/helpers/funasrManager.js b/src/helpers/funasrManager.js index e964085..ba1da2e 100644 --- a/src/helpers/funasrManager.js +++ b/src/helpers/funasrManager.js @@ -880,6 +880,10 @@ class FunASRManager { const possiblePaths = [ // 优先使用 uv 虚拟环境中的 Python + // Windows 路徑 + path.join(projectRoot, ".venv", "Scripts", "python.exe"), + path.join(projectRoot, ".venv", "Scripts", "python3.exe"), + // Unix/macOS 路徑 path.join(projectRoot, ".venv", "bin", "python3.11"), path.join(projectRoot, ".venv", "bin", "python3"), path.join(projectRoot, ".venv", "bin", "python"), diff --git a/src/helpers/logManager.js b/src/helpers/logManager.js index 402e43c..0d6297e 100644 --- a/src/helpers/logManager.js +++ b/src/helpers/logManager.js @@ -4,16 +4,35 @@ const os = require('os'); class LogManager { constructor() { - this.logDir = this.getLogDirectory(); + // 使用臨時目錄作為初始值,等 Electron 準備好後再更新 + this.logDir = path.join(os.tmpdir(), 'ququ-logs'); this.logFile = path.join(this.logDir, 'app.log'); this.funasrLogFile = path.join(this.logDir, 'funasr.log'); + this._initialized = false; this.ensureLogDirectory(); } + // 嘗試更新到正確的日誌目錄 + _tryUpdateLogDir() { + if (this._initialized) return; + try { + const electron = require('electron'); + if (electron.app && typeof electron.app.getPath === 'function') { + const userDataPath = electron.app.getPath('userData'); + this.logDir = path.join(userDataPath, 'logs'); + this.logFile = path.join(this.logDir, 'app.log'); + this.funasrLogFile = path.join(this.logDir, 'funasr.log'); + this.ensureLogDirectory(); + this._initialized = true; + } + } catch (e) { + // Electron 尚未準備好,使用臨時目錄 + } + } + getLogDirectory() { - // 在用户目录下创建日志文件夹 - const userDataPath = require('electron').app.getPath('userData'); - return path.join(userDataPath, 'logs'); + this._tryUpdateLogDir(); + return this.logDir; } ensureLogDirectory() { @@ -27,6 +46,7 @@ class LogManager { } log(level, message, data = null) { + this._tryUpdateLogDir(); const timestamp = new Date().toISOString(); const logEntry = { timestamp, @@ -165,13 +185,25 @@ class LogManager { // 获取系统信息用于调试 getSystemInfo() { + this._tryUpdateLogDir(); + let appVersion = 'unknown'; + let userDataPath = this.logDir; + try { + const electron = require('electron'); + if (electron.app && typeof electron.app.getVersion === 'function') { + appVersion = electron.app.getVersion(); + userDataPath = electron.app.getPath('userData'); + } + } catch (e) { + // Electron 尚未準備好 + } return { platform: process.platform, arch: process.arch, nodeVersion: process.version, electronVersion: process.versions.electron, - appVersion: require('electron').app.getVersion(), - userDataPath: require('electron').app.getPath('userData'), + appVersion, + userDataPath, logDir: this.logDir, env: { NODE_ENV: process.env.NODE_ENV, diff --git a/start-electron.js b/start-electron.js new file mode 100644 index 0000000..2ee4041 --- /dev/null +++ b/start-electron.js @@ -0,0 +1,35 @@ +#!/usr/bin/env node +// 啟動腳本 - 清除 ELECTRON_RUN_AS_NODE 環境變數 + +// 刪除會干擾 Electron 的環境變數 +delete process.env.ELECTRON_RUN_AS_NODE; + +const { spawn } = require('child_process'); +const path = require('path'); + +// 獲取 electron 可執行文件路徑 +const electronPath = require('electron'); + +// 獲取命令行參數 +const args = process.argv.slice(2); + +// 添加當前目錄作為 electron 的入口點(確保 '.' 在參數最前面) +args.unshift('.'); + +console.log('Starting Electron with:', electronPath); +console.log('Args:', args); +console.log('ELECTRON_RUN_AS_NODE:', process.env.ELECTRON_RUN_AS_NODE); + +// 創建新的環境變數對象,不包含 ELECTRON_RUN_AS_NODE +const env = { ...process.env }; +delete env.ELECTRON_RUN_AS_NODE; + +// 啟動 Electron +const child = spawn(electronPath, args, { + stdio: 'inherit', + env: env +}); + +child.on('close', (code) => { + process.exit(code); +});