From 55f0147bdd384579a63e2a9d2e63db137c6a91ec Mon Sep 17 00:00:00 2001 From: imbytecat Date: Fri, 16 Jan 2026 20:47:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=20Nitro=20sidecar=20?= =?UTF-8?q?=E8=BF=9B=E7=A8=8B=E5=90=AF=E5=8A=A8=E4=B8=8E=E7=9B=91=E6=8E=A7?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入必要的同步与时间处理模块,优化 Nitro sidecar 进程的启动与监控逻辑,确保服务器就绪后正确创建主窗口并处理启动超时和失败情况。 --- src/lib.rs | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index d348ca7..d653631 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,8 +1,8 @@ -use tauri::Manager; -use tauri_plugin_shell::ShellExt; -use tauri_plugin_shell::process::{CommandEvent, CommandChild}; -use std::time::Duration; use std::sync::Mutex; +use std::time::Duration; +use tauri::Manager; +use tauri_plugin_shell::process::{CommandChild, CommandEvent}; +use tauri_plugin_shell::ShellExt; // 全局状态:存储 Nitro 进程句柄 struct NitroProcess(Mutex>); @@ -38,74 +38,74 @@ pub fn run() { .setup(|app| { // 使用 Tauri 的状态管理存储进程句柄 app.manage(NitroProcess(Mutex::new(None))); - + let app_handle = app.handle().clone(); - + // 异步启动 Nitro sidecar tauri::async_runtime::spawn(async move { // 查找可用端口 let port = find_available_port(3000).await; println!("使用端口: {}", port); - + // 启动 sidecar let sidecar = app_handle .shell() .sidecar("nitro-server") .expect("无法找到 nitro-server sidecar") .env("NITRO_PORT", port.to_string()); - + let (mut rx, child) = sidecar.spawn().expect("启动 sidecar 失败"); - + // 保存进程句柄到全局状态 if let Some(state) = app_handle.try_state::() { *state.0.lock().unwrap() = Some(child); } - + // 监听 stdout,等待服务器就绪信号 let start_time = std::time::Instant::now(); let timeout = Duration::from_secs(5); let mut server_ready = false; - + while let Some(event) = rx.recv().await { if let CommandEvent::Stdout(line) = event { let output = String::from_utf8_lossy(&line); println!("Nitro: {}", output); - + // 检测服务器启动成功的标志 if output.contains("Listening on:") || output.contains("localhost") { server_ready = true; println!("✓ Nitro 服务器启动成功!"); - + // 创建主窗口 let url = format!("http://localhost:{}", port); tauri::WebviewWindowBuilder::new( &app_handle, "main", - tauri::WebviewUrl::External(url.parse().unwrap()) + tauri::WebviewUrl::External(url.parse().unwrap()), ) .title("Nitro Application") .inner_size(1200.0, 800.0) .center() .build() .expect("创建窗口失败"); - + break; } } - + // 超时检查 if start_time.elapsed() > timeout { eprintln!("✗ 启动超时:Nitro 服务器未能在 5 秒内启动"); break; } } - + if !server_ready { eprintln!("✗ Nitro 服务器启动失败"); std::process::exit(1); } }); - + Ok(()) }) .invoke_handler(tauri::generate_handler![greet])