init
This commit is contained in:
65
internal/platform/darwin.go
Normal file
65
internal/platform/darwin.go
Normal file
@@ -0,0 +1,65 @@
|
||||
package platform
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"os/exec"
|
||||
)
|
||||
|
||||
// DarwinPlatform macOS 平台实现
|
||||
type DarwinPlatform struct {
|
||||
homeDir string
|
||||
}
|
||||
|
||||
// NewDarwinPlatform 创建 macOS 平台实例
|
||||
func NewDarwinPlatform() *DarwinPlatform {
|
||||
home, _ := os.UserHomeDir()
|
||||
return &DarwinPlatform{homeDir: home}
|
||||
}
|
||||
|
||||
func (p *DarwinPlatform) OS() string { return "darwin" }
|
||||
func (p *DarwinPlatform) Arch() string { return "amd64" } // TODO: detect properly
|
||||
func (p *DarwinPlatform) HomeDir() string { return p.homeDir }
|
||||
|
||||
func (p *DarwinPlatform) ConfigDir() string {
|
||||
return p.homeDir + "/Library/Application Support"
|
||||
}
|
||||
|
||||
func (p *DarwinPlatform) DataDir() string {
|
||||
return p.homeDir + "/Library/Application Support"
|
||||
}
|
||||
|
||||
func (p *DarwinPlatform) GetEnvVar(key string) string {
|
||||
return os.Getenv(key)
|
||||
}
|
||||
|
||||
func (p *DarwinPlatform) SetEnvVar(ctx context.Context, key, value string) error {
|
||||
// On macOS, set via launchctl and shell profile
|
||||
cmd := exec.CommandContext(ctx, "launchctl", "setenv", key, value)
|
||||
return cmd.Run()
|
||||
}
|
||||
|
||||
func (p *DarwinPlatform) AddToPath(ctx context.Context, dir string) error {
|
||||
// TODO: Add to shell profile
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *DarwinPlatform) IsAdmin() bool {
|
||||
return os.Geteuid() == 0
|
||||
}
|
||||
|
||||
func (p *DarwinPlatform) PackageManagers() []string {
|
||||
var pms []string
|
||||
if _, err := exec.LookPath("brew"); err == nil {
|
||||
pms = append(pms, "homebrew")
|
||||
}
|
||||
return pms
|
||||
}
|
||||
|
||||
func (p *DarwinPlatform) DefaultShell() string {
|
||||
shell := os.Getenv("SHELL")
|
||||
if shell != "" {
|
||||
return shell
|
||||
}
|
||||
return "/bin/zsh"
|
||||
}
|
||||
82
internal/platform/linux.go
Normal file
82
internal/platform/linux.go
Normal file
@@ -0,0 +1,82 @@
|
||||
package platform
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"os/exec"
|
||||
)
|
||||
|
||||
// LinuxPlatform Linux 平台实现
|
||||
type LinuxPlatform struct {
|
||||
homeDir string
|
||||
}
|
||||
|
||||
// NewLinuxPlatform 创建 Linux 平台实例
|
||||
func NewLinuxPlatform() *LinuxPlatform {
|
||||
home, _ := os.UserHomeDir()
|
||||
return &LinuxPlatform{homeDir: home}
|
||||
}
|
||||
|
||||
func (p *LinuxPlatform) OS() string { return "linux" }
|
||||
func (p *LinuxPlatform) Arch() string { return "amd64" } // TODO: detect properly
|
||||
func (p *LinuxPlatform) HomeDir() string { return p.homeDir }
|
||||
|
||||
func (p *LinuxPlatform) ConfigDir() string {
|
||||
if dir := os.Getenv("XDG_CONFIG_HOME"); dir != "" {
|
||||
return dir
|
||||
}
|
||||
return p.homeDir + "/.config"
|
||||
}
|
||||
|
||||
func (p *LinuxPlatform) DataDir() string {
|
||||
if dir := os.Getenv("XDG_DATA_HOME"); dir != "" {
|
||||
return dir
|
||||
}
|
||||
return p.homeDir + "/.local/share"
|
||||
}
|
||||
|
||||
func (p *LinuxPlatform) GetEnvVar(key string) string {
|
||||
return os.Getenv(key)
|
||||
}
|
||||
|
||||
func (p *LinuxPlatform) SetEnvVar(ctx context.Context, key, value string) error {
|
||||
// TODO: Add to shell profile
|
||||
return os.Setenv(key, value)
|
||||
}
|
||||
|
||||
func (p *LinuxPlatform) AddToPath(ctx context.Context, dir string) error {
|
||||
// TODO: Add to shell profile
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *LinuxPlatform) IsAdmin() bool {
|
||||
return os.Geteuid() == 0
|
||||
}
|
||||
|
||||
func (p *LinuxPlatform) PackageManagers() []string {
|
||||
var pms []string
|
||||
if _, err := exec.LookPath("apt"); err == nil {
|
||||
pms = append(pms, "apt")
|
||||
}
|
||||
if _, err := exec.LookPath("dnf"); err == nil {
|
||||
pms = append(pms, "dnf")
|
||||
}
|
||||
if _, err := exec.LookPath("yum"); err == nil {
|
||||
pms = append(pms, "yum")
|
||||
}
|
||||
if _, err := exec.LookPath("pacman"); err == nil {
|
||||
pms = append(pms, "pacman")
|
||||
}
|
||||
if _, err := exec.LookPath("snap"); err == nil {
|
||||
pms = append(pms, "snap")
|
||||
}
|
||||
return pms
|
||||
}
|
||||
|
||||
func (p *LinuxPlatform) DefaultShell() string {
|
||||
shell := os.Getenv("SHELL")
|
||||
if shell != "" {
|
||||
return shell
|
||||
}
|
||||
return "/bin/bash"
|
||||
}
|
||||
57
internal/platform/platform.go
Normal file
57
internal/platform/platform.go
Normal file
@@ -0,0 +1,57 @@
|
||||
package platform
|
||||
|
||||
import (
|
||||
"context"
|
||||
"runtime"
|
||||
)
|
||||
|
||||
// Platform 平台适配接口
|
||||
type Platform interface {
|
||||
// OS 返回操作系统标识
|
||||
OS() string
|
||||
|
||||
// Arch 返回架构标识
|
||||
Arch() string
|
||||
|
||||
// HomeDir 返回用户主目录
|
||||
HomeDir() string
|
||||
|
||||
// ConfigDir 返回配置文件目录
|
||||
ConfigDir() string
|
||||
|
||||
// DataDir 返回数据目录
|
||||
DataDir() string
|
||||
|
||||
// GetEnvVar 获取环境变量
|
||||
GetEnvVar(key string) string
|
||||
|
||||
// SetEnvVar 设置用户级环境变量
|
||||
SetEnvVar(ctx context.Context, key, value string) error
|
||||
|
||||
// AddToPath 添加目录到 PATH
|
||||
AddToPath(ctx context.Context, dir string) error
|
||||
|
||||
// IsAdmin 是否以管理员身份运行
|
||||
IsAdmin() bool
|
||||
|
||||
// PackageManagers 返回可用的包管理器名称
|
||||
PackageManagers() []string
|
||||
|
||||
// DefaultShell 返回默认 Shell
|
||||
DefaultShell() string
|
||||
}
|
||||
|
||||
// Detect 检测当前平台并返回对应的 Platform 实现
|
||||
func Detect() Platform {
|
||||
switch runtime.GOOS {
|
||||
case "windows":
|
||||
return NewWindowsPlatform()
|
||||
case "darwin":
|
||||
return NewDarwinPlatform()
|
||||
case "linux":
|
||||
return NewLinuxPlatform()
|
||||
default:
|
||||
// Fallback to Linux
|
||||
return NewLinuxPlatform()
|
||||
}
|
||||
}
|
||||
83
internal/platform/windows.go
Normal file
83
internal/platform/windows.go
Normal file
@@ -0,0 +1,83 @@
|
||||
package platform
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"os/exec"
|
||||
)
|
||||
|
||||
// WindowsPlatform Windows 平台实现
|
||||
type WindowsPlatform struct {
|
||||
homeDir string
|
||||
}
|
||||
|
||||
// NewWindowsPlatform 创建 Windows 平台实例
|
||||
func NewWindowsPlatform() *WindowsPlatform {
|
||||
return &WindowsPlatform{
|
||||
homeDir: os.Getenv("USERPROFILE"),
|
||||
}
|
||||
}
|
||||
|
||||
func (p *WindowsPlatform) OS() string { return "windows" }
|
||||
func (p *WindowsPlatform) Arch() string { return os.Getenv("PROCESSOR_ARCHITECTURE") }
|
||||
|
||||
func (p *WindowsPlatform) HomeDir() string {
|
||||
return p.homeDir
|
||||
}
|
||||
|
||||
func (p *WindowsPlatform) ConfigDir() string {
|
||||
if dir := os.Getenv("APPDATA"); dir != "" {
|
||||
return dir
|
||||
}
|
||||
return p.homeDir + "\\AppData\\Roaming"
|
||||
}
|
||||
|
||||
func (p *WindowsPlatform) DataDir() string {
|
||||
if dir := os.Getenv("LOCALAPPDATA"); dir != "" {
|
||||
return dir
|
||||
}
|
||||
return p.homeDir + "\\AppData\\Local"
|
||||
}
|
||||
|
||||
func (p *WindowsPlatform) GetEnvVar(key string) string {
|
||||
return os.Getenv(key)
|
||||
}
|
||||
|
||||
func (p *WindowsPlatform) SetEnvVar(ctx context.Context, key, value string) error {
|
||||
cmd := exec.CommandContext(ctx, "setx", key, value)
|
||||
return cmd.Run()
|
||||
}
|
||||
|
||||
func (p *WindowsPlatform) AddToPath(ctx context.Context, dir string) error {
|
||||
currentPath := os.Getenv("PATH")
|
||||
newPath := dir + ";" + currentPath
|
||||
return p.SetEnvVar(ctx, "PATH", newPath)
|
||||
}
|
||||
|
||||
func (p *WindowsPlatform) IsAdmin() bool {
|
||||
// Check if running as administrator on Windows
|
||||
cmd := exec.Command("net", "session")
|
||||
err := cmd.Run()
|
||||
return err == nil
|
||||
}
|
||||
|
||||
func (p *WindowsPlatform) PackageManagers() []string {
|
||||
var pms []string
|
||||
if _, err := exec.LookPath("scoop"); err == nil {
|
||||
pms = append(pms, "scoop")
|
||||
}
|
||||
if _, err := exec.LookPath("choco"); err == nil {
|
||||
pms = append(pms, "chocolatey")
|
||||
}
|
||||
if _, err := exec.LookPath("winget"); err == nil {
|
||||
pms = append(pms, "winget")
|
||||
}
|
||||
return pms
|
||||
}
|
||||
|
||||
func (p *WindowsPlatform) DefaultShell() string {
|
||||
if _, err := exec.LookPath("pwsh"); err == nil {
|
||||
return "pwsh" // PowerShell 7+
|
||||
}
|
||||
return "powershell" // Windows PowerShell 5.1
|
||||
}
|
||||
Reference in New Issue
Block a user