github.com/apex/up@v1.7.1/internal/cli/start/start.go (about) 1 package start 2 3 import ( 4 "fmt" 5 "net" 6 "net/http" 7 "os" 8 9 "github.com/apex/log" 10 "github.com/pkg/browser" 11 "github.com/pkg/errors" 12 "github.com/tj/kingpin" 13 14 "github.com/apex/up/handler" 15 "github.com/apex/up/internal/cli/root" 16 "github.com/apex/up/internal/logs/text" 17 "github.com/apex/up/internal/stats" 18 ) 19 20 func init() { 21 cmd := root.Command("start", "Start development server.") 22 cmd.Example(`up start`, "Start development server on port 3000.") 23 cmd.Example(`up start -o`, "Start development server and open in the browser.") 24 cmd.Example(`up start --address :5000`, "Start development server on port 5000.") 25 cmd.Example(`up start -c 'go run main.go'`, "Override proxy command.") 26 cmd.Example(`up start -oc 'gin --port $PORT'`, "Override proxy command and open in the browser.") 27 28 stage := cmd.Flag("stage", "Target stage name.").Short('s').Default("development").String() 29 command := cmd.Flag("command", "Proxy command override").Short('c').String() 30 open := cmd.Flag("open", "Open endpoint in the browser.").Short('o').Bool() 31 addr := cmd.Flag("address", "Address for server.").Default("localhost:3000").String() 32 33 cmd.Action(func(_ *kingpin.ParseContext) error { 34 log.SetHandler(text.New(os.Stdout)) 35 36 c, p, err := root.Init() 37 if err != nil { 38 return errors.Wrap(err, "initializing") 39 } 40 41 for k, v := range c.Environment { 42 os.Setenv(k, v) 43 } 44 45 stats.Track("Start", map[string]interface{}{ 46 "address": *addr, 47 "has_command": *command != "", 48 }) 49 50 if err := p.Init(*stage); err != nil { 51 return errors.Wrap(err, "initializing") 52 } 53 54 if err := c.Override(*stage); err != nil { 55 return errors.Wrap(err, "overriding") 56 } 57 58 if s := *command; s != "" { 59 c.Proxy.Command = s 60 } 61 62 h, err := handler.FromConfig(c) 63 if err != nil { 64 return errors.Wrap(err, "selecting handler") 65 } 66 67 h, err = handler.New(c, h) 68 if err != nil { 69 return errors.Wrap(err, "initializing handler") 70 } 71 72 if *open { 73 _, port, _ := net.SplitHostPort(*addr) 74 browser.OpenURL(fmt.Sprintf("http://localhost:%s", port)) 75 } 76 77 log.WithField("address", "http://"+*addr).Info("listening") 78 if err := http.ListenAndServe(*addr, h); err != nil { 79 return errors.Wrap(err, "binding") 80 } 81 82 return nil 83 }) 84 }