Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 21 additions & 15 deletions main.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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,
Expand Down Expand Up @@ -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();
});

Expand Down
8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand All @@ -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",
Expand Down Expand Up @@ -158,4 +158,4 @@
"category": "Office"
}
}
}
}
4 changes: 4 additions & 0 deletions src/helpers/funasrManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
Expand Down
44 changes: 38 additions & 6 deletions src/helpers/logManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -27,6 +46,7 @@ class LogManager {
}

log(level, message, data = null) {
this._tryUpdateLogDir();
const timestamp = new Date().toISOString();
const logEntry = {
timestamp,
Expand Down Expand Up @@ -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,
Expand Down
35 changes: 35 additions & 0 deletions start-electron.js
Original file line number Diff line number Diff line change
@@ -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);
});