Skip to content

Commit bab06c8

Browse files
committed
fix(openlist): 修复 openlist 闪退问题
问题原因: openlist 使用相对路径(如 data/data.db)访问数据库文件,这些路径 相对于工作目录解析。之前工作目录设置为 ~/.netmount,但 openlist 数据在 ~/.netmount/openlist,导致找不到数据库文件而闪退。 解决方案: 1. spawn_sidecar 和 run_sidecar_once 函数添加 cwd 参数 2. 前端启动 openlist 时传入数据目录作为工作目录 3. setOpenlistPass CLI 命令也使用正确的数据目录 修改文件: - src-tauri/src/lib.rs: 添加 cwd 参数支持 - src/utils/sidecar.ts: 更新函数签名 - src/utils/sidecarService.ts: 传递 cwd 参数 - src/utils/openlist/process.ts: 传入数据目录 - src/utils/openlist/openlist.ts: 传入数据目录
1 parent 896a110 commit bab06c8

5 files changed

Lines changed: 31 additions & 14 deletions

File tree

src-tauri/src/lib.rs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ async fn spawn_sidecar(
419419
app: tauri::AppHandle<Runtime>,
420420
name: String,
421421
args: Vec<String>,
422+
cwd: Option<String>,
422423
) -> Result<u32, String> {
423424
use std::process::Stdio;
424425
use std::io::Write as _;
@@ -452,10 +453,14 @@ async fn spawn_sidecar(
452453
), tauri::path::BaseDirectory::Resource)
453454
.map_err(|e| format!("Failed to resolve sidecar path: {}", e))?;
454455

455-
// 获取工作目录(用户主目录下的 .netmount)
456-
let work_dir = app.path().home_dir()
457-
.map_err(|e| format!("Failed to get home dir: {}", e))?
458-
.join(".netmount");
456+
// 获取工作目录:优先使用传入的 cwd,否则使用默认目录
457+
let work_dir = if let Some(cwd_path) = cwd {
458+
std::path::PathBuf::from(cwd_path)
459+
} else {
460+
app.path().home_dir()
461+
.map_err(|e| format!("Failed to get home dir: {}", e))?
462+
.join(".netmount")
463+
};
459464

460465
// 确保工作目录存在
461466
if !work_dir.exists() {
@@ -658,6 +663,7 @@ async fn run_sidecar_once(
658663
name: String,
659664
args: Vec<String>,
660665
timeout_ms: Option<u64>,
666+
cwd: Option<String>,
661667
) -> Result<RunSidecarOnceResult, String> {
662668
use std::io::Write as _;
663669
use std::process::Stdio;
@@ -695,11 +701,15 @@ async fn run_sidecar_once(
695701
)
696702
.map_err(|e| format!("Failed to resolve sidecar path: {}", e))?;
697703

698-
let work_dir = app
699-
.path()
700-
.home_dir()
701-
.map_err(|e| format!("Failed to get home dir: {}", e))?
702-
.join(".netmount");
704+
// 获取工作目录:优先使用传入的 cwd,否则使用默认目录
705+
let work_dir = if let Some(cwd_path) = cwd {
706+
std::path::PathBuf::from(cwd_path)
707+
} else {
708+
app.path().home_dir()
709+
.map_err(|e| format!("Failed to get home dir: {}", e))?
710+
.join(".netmount")
711+
};
712+
703713
if !work_dir.exists() {
704714
let _ = std::fs::create_dir_all(&work_dir);
705715
}

src/utils/openlist/openlist.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,11 @@ async function setOpenlistPass(pass: string) {
115115
// v1.1.2 行为:每次启动都无条件写入 admin 密码,避免升级/迁移导致的"密码不一致"卡死。
116116
// OpenList 提供 CLI:openlist --data <dir> admin set <pass>
117117
// 预启动阶段可能失败(数据库不存在),服务启动后再调用此函数会成功
118+
const dataDir = openlistDataDir()
118119
try {
119-
await runSidecarOnce('binaries/openlist', ['--data', openlistDataDir(), 'admin', 'set', pass], {
120+
await runSidecarOnce('binaries/openlist', ['--data', dataDir, 'admin', 'set', pass], {
120121
timeoutMs: 15_000,
122+
cwd: dataDir,
121123
})
122124
return
123125
} catch (e) {

src/utils/openlist/process.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ async function startOpenlist() {
4848
console.log('OpenList start args:', args)
4949

5050
// 使用 Rust 端启动 sidecar,确保由主进程创建
51+
// 传入数据目录作为工作目录,确保 openlist 能正确找到数据库文件
52+
const dataDir = openlistDataDir()
5153
let pid: number
5254
try {
5355
pid = await startSidecarAndWait({
@@ -56,6 +58,7 @@ async function startOpenlist() {
5658
args,
5759
readyCheck: openlist_api_ping,
5860
timeoutMs: 30_000,
61+
cwd: dataDir,
5962
})
6063
} catch (e) {
6164
console.error('Failed to spawn OpenList:', e)

src/utils/sidecar.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,20 @@ function shortSidecarName(nameOrBinary: string): string {
1818
return nameOrBinary.includes('/') ? nameOrBinary.split('/').pop() || nameOrBinary : nameOrBinary
1919
}
2020

21-
async function spawnSidecar(binary: string, args: string[]): Promise<number> {
22-
return await invoke<number>('spawn_sidecar', { name: binary, args })
21+
async function spawnSidecar(binary: string, args: string[], cwd?: string): Promise<number> {
22+
return await invoke<number>('spawn_sidecar', { name: binary, args, cwd })
2323
}
2424

2525
async function runSidecarOnce(
2626
binary: string,
2727
args: string[],
28-
opts?: { timeoutMs?: number }
28+
opts?: { timeoutMs?: number; cwd?: string }
2929
): Promise<RunSidecarOnceResult> {
3030
return await invoke<RunSidecarOnceResult>('run_sidecar_once', {
3131
name: binary,
3232
args,
3333
timeout_ms: opts?.timeoutMs,
34+
cwd: opts?.cwd,
3435
})
3536
}
3637

src/utils/sidecarService.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ type StartAndWaitOptions = {
1111
timeoutMs?: number
1212
initialDelayMs?: number
1313
includeLogTailOnError?: boolean
14+
cwd?: string
1415
}
1516

1617
async function startSidecarAndWait(opts: StartAndWaitOptions): Promise<number> {
@@ -19,7 +20,7 @@ async function startSidecarAndWait(opts: StartAndWaitOptions): Promise<number> {
1920
let pid = 0
2021

2122
try {
22-
pid = await spawnSidecar(opts.binary, opts.args)
23+
pid = await spawnSidecar(opts.binary, opts.args, opts.cwd)
2324
if (opts.initialDelayMs && opts.initialDelayMs > 0) {
2425
await sleep(opts.initialDelayMs)
2526
}

0 commit comments

Comments
 (0)