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  }