Files
QWQLwToo 079ee4eaeb
build-winui / winui (push) Has been cancelled
Add server components
2026-06-26 13:28:09 +08:00

110 lines
2.1 KiB
Go

package utils
import (
"os"
"runtime"
"strings"
)
// OSInfo 操作系统信息
type OSInfo struct {
OS string // 操作系统类型: windows, linux, darwin
Arch string // 架构: amd64, arm64, 386
IsCGO bool // 是否支持 CGO
DataDir string // 数据目录路径
}
var currentOS *OSInfo
// DetectOS 检测操作系统环境
func DetectOS() *OSInfo {
if currentOS != nil {
return currentOS
}
osType := runtime.GOOS
arch := runtime.GOARCH
// 检测 CGO 支持
// 注意:CGO 支持在编译时确定,运行时无法准确检测
// 这里通过检查环境变量或尝试使用 SQLite 来判断
isCGO := true
// 如果设置了 CGO_ENABLED=0,则不支持 CGO
if cgoEnv := os.Getenv("CGO_ENABLED"); cgoEnv == "0" {
isCGO = false
}
// 确定数据目录
dataDir := "data"
if osType == "windows" {
// Windows 使用相对路径
dataDir = "data"
} else {
// Linux/macOS 使用相对路径
dataDir = "data"
}
currentOS = &OSInfo{
OS: normalizeOS(osType),
Arch: normalizeArch(arch),
IsCGO: isCGO,
DataDir: dataDir,
}
return currentOS
}
// normalizeOS 标准化操作系统名称
func normalizeOS(os string) string {
os = strings.ToLower(os)
switch os {
case "windows":
return "windows"
case "linux":
return "linux"
case "darwin":
return "darwin"
case "freebsd", "openbsd", "netbsd":
return "unix"
default:
return "unknown"
}
}
// normalizeArch 标准化架构名称
func normalizeArch(arch string) string {
arch = strings.ToLower(arch)
switch arch {
case "amd64", "x86_64":
return "amd64"
case "386", "i386", "i686":
return "386"
case "arm64", "aarch64":
return "arm64"
case "arm":
return "arm"
default:
return arch
}
}
// GetOSInfo 获取操作系统信息
func GetOSInfo() *OSInfo {
return DetectOS()
}
// IsWindows 判断是否为 Windows
func IsWindows() bool {
return DetectOS().OS == "windows"
}
// IsLinux 判断是否为 Linux
func IsLinux() bool {
return DetectOS().OS == "linux"
}
// IsDarwin 判断是否为 macOS
func IsDarwin() bool {
return DetectOS().OS == "darwin"
}