Files
momentry_studio/src-tauri/src/paths.rs
Momentry Studio 0973f5cfd7 feat: 动态路径系统 - 支持任意用户环境部署
问题:
- 100+ 处硬编码路径 /Users/accusys
- 无法在不同用户环境部署
- 配置文件路径固定

解决方案:
1. ✅ 创建 paths.rs 模块
   - get_home_dir() - 获取用户主目录
   - get_momentry_core_root() - Core API 根目录
   - get_markbase_root() - MarkBase 根目录
   - get_studio_root() - Studio 根目录
   - get_storage_root() - 存储根目录
   - 环境变量优先 > 用户主目录推断

2. ✅ 修改 main.rs
   - 移除所有硬编码路径
   - 使用动态路径函数
   - 支持环境变量配置

3. ✅ 创建配置模板
   - admin_config.json.template
   - .env.template
   - 使用 {{HOME}} 占位符

4. ✅ 创建自动化脚本
   - install.sh - 通用安装脚本
   - generate_config.sh - 配置生成脚本
   - 自动检测用户环境

特性:
- ✅ 支持任意用户环境
- ✅ 自动检测用户主目录
- ✅ 环境变量优先级控制
- ✅ 一键安装部署

测试:
- ✅ 编译通过 (cargo check)
- ⚠️ 需要在新环境测试

使用方法:
1. 克隆项目
2. ./install.sh
3. 编辑 .env
4. npm run proxy

适用环境:
- m5max48: /Users/accusys
- m4promini: /Users/nextorageai
- 任意 macOS 环境
2026-10-12 12:34:53 +08:00

101 lines
2.8 KiB
Rust

// Helper functions to get directory paths dynamically
// Priority: Environment Variable > User Home Directory + Standard Path
use std::env;
use std::path::PathBuf;
/// Get user home directory
pub fn get_home_dir() -> PathBuf {
dirs::home_dir()
.unwrap_or_else(|| PathBuf::from("."))
}
/// Get Momentry Core root directory
/// Priority: MOMENTRY_CORE_ROOT env var > ~/momentry_core
pub fn get_momentry_core_root() -> String {
env::var("MOMENTRY_CORE_ROOT")
.unwrap_or_else(|_| {
format!("{}/momentry_core", get_home_dir().display())
})
}
/// Get MarkBase root directory
/// Priority: MARKBASE_ROOT env var > ~/markbase
pub fn get_markbase_root() -> String {
env::var("MARKBASE_ROOT")
.unwrap_or_else(|_| {
format!("{}/markbase", get_home_dir().display())
})
}
/// Get Studio root directory
/// Priority: MOMENTRY_STUDIO_ROOT env var > ~/momentry_studio
pub fn get_studio_root() -> String {
env::var("MOMENTRY_STUDIO_ROOT")
.unwrap_or_else(|_| {
format!("{}/momentry_studio", get_home_dir().display())
})
}
/// Get Momentry root directory
/// Priority: MOMENTRY_ROOT env var > ~/momentry
pub fn get_momentry_root() -> String {
env::var("MOMENTRY_ROOT")
.unwrap_or_else(|_| {
format!("{}/momentry", get_home_dir().display())
})
}
/// Get storage root directory
/// Priority: STORAGE_ROOT env var > ~/momentry/var/sftpgo/data
pub fn get_storage_root() -> String {
env::var("STORAGE_ROOT")
.unwrap_or_else(|_| {
format!("{}/momentry/var/sftpgo/data", get_home_dir().display())
})
}
/// Get MarkBaseEngine root directory
/// Priority: MARKBASE_ENGINE_ROOT env var > ~/MarkBaseEngine
pub fn get_markbase_engine_root() -> String {
env::var("MARKBASE_ENGINE_ROOT")
.unwrap_or_else(|_| {
format!("{}/MarkBaseEngine", get_home_dir().display())
})
}
/// Get worker PID file path
pub fn get_worker_pid_file() -> String {
format!("{}/logs/worker_3002.pid", get_momentry_core_root())
}
/// Get worker log file path
pub fn get_worker_log_file() -> String {
format!("{}/logs/worker_3002.log", get_momentry_core_root())
}
#[cfg(test)]
mod path_tests {
use super::*;
#[test]
fn test_get_home_dir() {
let home = get_home_dir();
assert!(home.exists() || home.to_str() == Some("."));
}
#[test]
fn test_get_momentry_core_root_without_env() {
env::remove_var("MOMENTRY_CORE_ROOT");
let root = get_momentry_core_root();
assert!(root.contains("momentry_core"));
}
#[test]
fn test_get_momentry_core_root_with_env() {
env::set_var("MOMENTRY_CORE_ROOT", "/custom/path/core");
let root = get_momentry_core_root();
assert_eq!(root, "/custom/path/core");
env::remove_var("MOMENTRY_CORE_ROOT");
}
}