mirror of Walter-Sparrow / lunar-tear
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Enhance dev runner with automatic service builds

+98 -5
+5
README.md
··· 141 141 142 142 Each service's output is prefixed with a colored label (`[auth]`, `[cdn]`, `[grpc]`). Press Ctrl+C to shut everything down. 143 143 144 + The dev runner automatically builds each service into `bin/` before launching. This means the binaries have stable file paths, so **Windows Firewall only prompts once** — subsequent runs reuse the same allowed executables. The wizard performs the same build step transparently. 145 + 144 146 Override defaults with namespaced flags: 145 147 146 148 ```bash ··· 221 223 | `make build` | Build the game server binary | 222 224 | `make build-cdn` | Build the CDN binary | 223 225 | `make build-auth` | Build the auth server binary | 226 + | `make build-dev` | Build the dev runner binary to `bin/` | 227 + | `make build-all` | Build all service binaries to `bin/` | 224 228 | `make build-import` | Build the import-snapshot tool | 225 229 | `make build-claim-account` | Build the claim-account tool | 230 + | `make clean` | Remove the `bin/` directory | 226 231 | `make dev` | Run all three services with one command | 227 232 | `make migrate` | Run goose migrations on `db/game.db` | 228 233 | `make import` | Import a snapshot (`SNAPSHOT=... UUID=...` required) |
+22 -1
server/Makefile
··· 30 30 build-claim-account: 31 31 go build -o claim-account$(EXE) ./cmd/claim-account 32 32 33 + build-dev: 34 + go build -o bin/dev$(EXE) ./cmd/dev 35 + 36 + build-all: 37 + ifeq ($(OS),Windows_NT) 38 + if not exist bin mkdir bin 39 + else 40 + mkdir -p bin 41 + endif 42 + go build -o bin/dev$(EXE) ./cmd/dev 43 + go build -o bin/auth-server$(EXE) ./cmd/auth-server 44 + go build -o bin/octo-cdn$(EXE) ./cmd/octo-cdn 45 + go build -o bin/lunar-tear$(EXE) ./cmd/lunar-tear 46 + 47 + clean: 48 + ifeq ($(OS),Windows_NT) 49 + if exist bin rmdir /s /q bin 50 + else 51 + rm -rf bin 52 + endif 53 + 33 54 dev: 34 55 go run ./cmd/dev $(ARGS) 35 56 ··· 50 71 endif 51 72 go run ./cmd/import-snapshot --snapshot $(SNAPSHOT) --uuid $(UUID) 52 73 53 - .PHONY: proto build build-cdn build-auth build-import build-claim-account dev migrate import 74 + .PHONY: proto build build-cdn build-auth build-import build-claim-account build-dev build-all clean dev migrate import
+56 -3
server/cmd/dev/main.go
··· 10 10 "os" 11 11 "os/exec" 12 12 "os/signal" 13 + "path/filepath" 14 + "runtime" 13 15 "sync" 14 16 "syscall" 15 17 ) ··· 28 30 cmd *exec.Cmd 29 31 } 30 32 33 + func binExt() string { 34 + if runtime.GOOS == "windows" { 35 + return ".exe" 36 + } 37 + return "" 38 + } 39 + 40 + func buildAll() { 41 + if err := os.MkdirAll("bin", 0755); err != nil { 42 + log.Fatalf("create bin/: %v", err) 43 + } 44 + 45 + type target struct { 46 + name string 47 + pkg string 48 + } 49 + targets := []target{ 50 + {"auth-server", "./cmd/auth-server"}, 51 + {"octo-cdn", "./cmd/octo-cdn"}, 52 + {"lunar-tear", "./cmd/lunar-tear"}, 53 + } 54 + 55 + ext := binExt() 56 + var wg sync.WaitGroup 57 + errs := make(chan error, len(targets)) 58 + 59 + for _, t := range targets { 60 + wg.Add(1) 61 + go func(t target) { 62 + defer wg.Done() 63 + out := filepath.Join("bin", t.name+ext) 64 + cmd := exec.Command("go", "build", "-o", out, t.pkg) 65 + cmd.Stdout = os.Stdout 66 + cmd.Stderr = os.Stderr 67 + if err := cmd.Run(); err != nil { 68 + errs <- fmt.Errorf("build %s: %w", t.name, err) 69 + } 70 + }(t) 71 + } 72 + wg.Wait() 73 + close(errs) 74 + 75 + for err := range errs { 76 + log.Fatal(err) 77 + } 78 + } 79 + 31 80 func main() { 32 81 // auth-server flags 33 82 authListen := flag.String("auth.listen", "0.0.0.0:3000", "auth-server listen address (host:port)") ··· 62 111 colorCyan = "" 63 112 } 64 113 114 + log.Println("building services...") 115 + buildAll() 116 + 117 + ext := binExt() 65 118 ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) 66 119 defer stop() 67 120 ··· 69 122 { 70 123 label: "auth", 71 124 color: colorGreen, 72 - cmd: exec.CommandContext(ctx, "go", "run", "./cmd/auth-server", 125 + cmd: exec.CommandContext(ctx, filepath.Join("bin", "auth-server"+ext), 73 126 "--listen", *authListen, 74 127 "--db", *authDB, 75 128 ), ··· 77 130 { 78 131 label: "cdn", 79 132 color: colorCyan, 80 - cmd: exec.CommandContext(ctx, "go", "run", "./cmd/octo-cdn", 133 + cmd: exec.CommandContext(ctx, filepath.Join("bin", "octo-cdn"+ext), 81 134 "--listen", *cdnListen, 82 135 "--public-addr", *cdnPublicAddr, 83 136 ), ··· 85 138 { 86 139 label: "grpc", 87 140 color: colorYellow, 88 - cmd: exec.CommandContext(ctx, "go", "run", "./cmd/lunar-tear", 141 + cmd: exec.CommandContext(ctx, filepath.Join("bin", "lunar-tear"+ext), 89 142 "--listen", *grpcListen, 90 143 "--public-addr", *grpcPublicAddr, 91 144 "--db", *grpcDB,
+15 -1
server/cmd/wizard/main.go
··· 795 795 } 796 796 797 797 func launchDev(ip string, p ports) { 798 - cmd := exec.Command("go", "run", "./cmd/dev", 798 + ext := "" 799 + if runtime.GOOS == "windows" { 800 + ext = ".exe" 801 + } 802 + devBin := filepath.Join("bin", "dev"+ext) 803 + 804 + _ = spinner.New().Title(" Building services...").Action(func() { 805 + if err := os.MkdirAll("bin", 0755); err != nil { 806 + fmt.Fprintf(os.Stderr, " Failed to create bin/: %v\n", err) 807 + os.Exit(1) 808 + } 809 + runQuiet(exec.Command("go", "build", "-o", devBin, "./cmd/dev"), "build dev") 810 + }).Run() 811 + 812 + cmd := exec.Command(devBin, 799 813 "--grpc.listen", fmt.Sprintf("0.0.0.0:%d", p.GRPC), 800 814 "--grpc.public-addr", fmt.Sprintf("%s:%d", ip, p.GRPC), 801 815 "--cdn.listen", fmt.Sprintf("0.0.0.0:%d", p.CDN),