package main import ( "context" "fmt" "os" "path/filepath" "time" "scout/pkg/client" "scout/pkg/updater" ) func main() { ctx := context.Background() server := os.Getenv("SCOUT_SERVER") if server == "" { server = "http://127.0.0.1:8080" } project := os.Getenv("SCOUT_PROJECT") var api *client.Client var err error if project == "" || project == "default" { api, err = client.New(server, client.WithSessionToken(os.Getenv("SCOUT_SESSION"))) } else { api, err = client.NewProject(server, project, client.WithSessionToken(os.Getenv("SCOUT_SESSION"))) } if err != nil { fail(err) } manager, err := updater.New(updater.Config{ Client: api, PackageName: "demo-core", CurrentVersion: "1.0.0", CurrentPath: filepath.Join(".", "demo-core-current"), RootDir: filepath.Join(".", ".scout-update"), Entrypoint: "demo-core", HealthTimeout: 2 * time.Minute, KeepReleases: 2, }) if err != nil { fail(err) } latest, available, err := manager.Check(ctx) if err != nil { fail(err) } if !available { fmt.Println("当前已是最新版本:", latest.Version) return } prepared, err := manager.Prepare(ctx, latest.Version) if err != nil { fail(err) } fmt.Println("更新已准备完成:", prepared.Version) fmt.Println("当前进程没有停止;请由业务界面询问用户何时重启。") if os.Getenv("SCOUT_RESTART_NOW") != "1" { return } if err := manager.Install(ctx); err != nil { fail(err) } if _, err := manager.Activate(); err != nil { fail(err) } fmt.Println("版本已切换,宿主应用现在可以退出并重新启动。") } func fail(err error) { fmt.Println("更新示例失败:", err) os.Exit(1) }