forked from imbytecat/fullstack-starter
refactor: 统一将 Sidecar 模式中的 Server 更名为 App
- 将构建输出文件名从 `server-` 更改为 `app-` 以匹配新的命名规范。 - 将 Sidecar 模式中的 Server 统一更名为 App,以准确反映其作为主业务逻辑载体的角色,并同步更新相关配置、文件命名、日志信息及代码注释。 - 更新允许执行的二进制文件为应用程序二进制文件。 - 将 Sidecar Server 相关的术语和日志信息统一更新为 Sidecar App,以准确反映实际启动的应用程序名称。 - 将外部二进制文件路径从 server 更改为 app
This commit is contained in:
@@ -6,8 +6,8 @@
|
||||
|
||||
- **项目类型**: Tauri v2 桌面应用(轻量级壳子)
|
||||
- **后端**: Rust (Edition 2021)
|
||||
- **架构**: Sidecar 模式 - Sidecar Server 承载主要业务逻辑
|
||||
- **设计理念**: Tauri 仅提供原生桌面能力(文件对话框、系统通知等),Web 逻辑全部由 Sidecar Server 处理
|
||||
- **架构**: Sidecar 模式 - Sidecar App 承载主要业务逻辑
|
||||
- **设计理念**: Tauri 仅提供原生桌面能力(文件对话框、系统通知等),Web 逻辑全部由 Sidecar App 处理
|
||||
- **开发模式**: 使用 localhost:3000(需手动启动开发服务器)
|
||||
- **生产模式**: 自动启动 Sidecar 二进制
|
||||
- **异步运行时**: Tokio
|
||||
@@ -99,7 +99,7 @@ app-desktop/
|
||||
│ │ └── mod.rs # 原生桌面功能命令 (文件对话框、通知等)
|
||||
│ └── sidecar.rs # Sidecar 进程管理 (启动、端口扫描、清理)
|
||||
├── binaries/ # Sidecar 二进制文件
|
||||
│ └── server-* # Sidecar Server 可执行文件 (示例: server)
|
||||
│ └── app-* # Sidecar App 可执行文件 (示例: app)
|
||||
├── capabilities/ # Tauri v2 权限配置
|
||||
│ └── default.json
|
||||
├── icons/ # 应用图标资源
|
||||
@@ -182,14 +182,14 @@ async fn is_port_available(port: u16) -> bool {
|
||||
// ✅ 推荐
|
||||
let sidecar = app_handle
|
||||
.shell()
|
||||
.sidecar("server")
|
||||
.expect("无法找到 server sidecar");
|
||||
.sidecar("app")
|
||||
.expect("无法找到 app sidecar");
|
||||
|
||||
let (mut rx, child) = sidecar.spawn().expect("启动 sidecar 失败");
|
||||
|
||||
// 日志记录
|
||||
eprintln!("✗ Sidecar Server 启动失败");
|
||||
println!("✓ Sidecar Server 启动成功!");
|
||||
eprintln!("✗ Sidecar App 启动失败");
|
||||
println!("✓ Sidecar App 启动成功!");
|
||||
|
||||
// ❌ 避免
|
||||
let data = read_file().unwrap(); // 无上下文信息
|
||||
@@ -226,7 +226,7 @@ tauri::async_runtime::spawn(async move {
|
||||
|
||||
```rust
|
||||
// ✅ 推荐
|
||||
// 全局状态:存储 Sidecar Server 进程句柄
|
||||
// 全局状态:存储 Sidecar App 进程句柄
|
||||
struct SidecarProcess(Mutex<Option<CommandChild>>);
|
||||
|
||||
// 检查端口是否可用
|
||||
@@ -297,8 +297,8 @@ if let Some(state) = app_handle.try_state::<SidecarProcess>() {
|
||||
// 启动 sidecar
|
||||
let sidecar = app_handle
|
||||
.shell()
|
||||
.sidecar("server")
|
||||
.expect("无法找到 server sidecar")
|
||||
.sidecar("app")
|
||||
.expect("无法找到 app sidecar")
|
||||
.env("PORT", port.to_string());
|
||||
|
||||
// 清理进程
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
"identifier": "shell:allow-execute",
|
||||
"allow": [
|
||||
{
|
||||
"name": "binaries/server",
|
||||
"name": "binaries/app",
|
||||
"sidecar": true
|
||||
}
|
||||
]
|
||||
|
||||
@@ -7,7 +7,7 @@ use tauri_plugin_shell::ShellExt;
|
||||
|
||||
// ===== 配置常量 =====
|
||||
|
||||
/// Sidecar Server 启动超时时间(秒)
|
||||
/// Sidecar App 启动超时时间(秒)
|
||||
const STARTUP_TIMEOUT_SECS: u64 = 5;
|
||||
|
||||
/// 默认起始端口
|
||||
@@ -73,7 +73,7 @@ pub fn spawn_sidecar(app_handle: tauri::AppHandle) {
|
||||
|
||||
// 生产模式:启动 sidecar 二进制
|
||||
tauri::async_runtime::spawn(async move {
|
||||
println!("🚀 生产模式:启动 Sidecar Server");
|
||||
println!("🚀 生产模式:启动 Sidecar App");
|
||||
|
||||
// 查找可用端口
|
||||
let port = find_available_port(DEFAULT_PORT).await;
|
||||
@@ -82,8 +82,8 @@ pub fn spawn_sidecar(app_handle: tauri::AppHandle) {
|
||||
// 启动 sidecar
|
||||
let sidecar = app_handle
|
||||
.shell()
|
||||
.sidecar("server")
|
||||
.expect("无法找到 server")
|
||||
.sidecar("app")
|
||||
.expect("无法找到 app")
|
||||
.env("PORT", port.to_string());
|
||||
|
||||
let (mut rx, child) = sidecar.spawn().expect("启动 sidecar 失败");
|
||||
@@ -96,17 +96,17 @@ pub fn spawn_sidecar(app_handle: tauri::AppHandle) {
|
||||
// 监听 stdout,等待服务器就绪信号
|
||||
let start_time = std::time::Instant::now();
|
||||
let timeout = Duration::from_secs(STARTUP_TIMEOUT_SECS);
|
||||
let mut server_ready = false;
|
||||
let mut app_ready = false;
|
||||
|
||||
while let Some(event) = rx.recv().await {
|
||||
if let CommandEvent::Stdout(line) = event {
|
||||
let output = String::from_utf8_lossy(&line);
|
||||
println!("Server: {}", output);
|
||||
println!("App: {}", output);
|
||||
|
||||
// 检测服务器启动成功的标志
|
||||
// 检测 App 启动成功的标志
|
||||
if output.contains("Listening on:") || output.contains("localhost") {
|
||||
server_ready = true;
|
||||
println!("✓ Server 启动成功!");
|
||||
app_ready = true;
|
||||
println!("✓ App 启动成功!");
|
||||
|
||||
// 创建主窗口
|
||||
let url = format!("http://localhost:{}", port);
|
||||
@@ -128,15 +128,15 @@ pub fn spawn_sidecar(app_handle: tauri::AppHandle) {
|
||||
// 超时检查
|
||||
if start_time.elapsed() > timeout {
|
||||
eprintln!(
|
||||
"✗ 启动超时: Server 未能在 {} 秒内启动",
|
||||
"✗ 启动超时: App 未能在 {} 秒内启动",
|
||||
STARTUP_TIMEOUT_SECS
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if !server_ready {
|
||||
eprintln!("✗ Server 启动失败");
|
||||
if !app_ready {
|
||||
eprintln!("✗ App 启动失败");
|
||||
std::process::exit(1);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -20,6 +20,6 @@
|
||||
"icons/icon.icns",
|
||||
"icons/icon.ico"
|
||||
],
|
||||
"externalBin": ["binaries/server"]
|
||||
"externalBin": ["binaries/app"]
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user