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