github.com/jacobsoderblom/buffalo@v0.11.0/buffalo/cmd/build/bin.go (about) 1 package build 2 3 import ( 4 "bytes" 5 "fmt" 6 "os" 7 "os/exec" 8 "regexp" 9 "strings" 10 "time" 11 12 "github.com/gobuffalo/envy" 13 "github.com/pkg/errors" 14 ) 15 16 func version() (string, string) { 17 _, err := exec.LookPath("git") 18 buildTime := fmt.Sprintf("\"%s\"", time.Now().Format(time.RFC3339)) 19 version := buildTime 20 if err == nil { 21 cmd := exec.Command("git", "rev-parse", "--short", "HEAD") 22 out := &bytes.Buffer{} 23 cmd.Stdout = out 24 cmd.Stderr = os.Stderr 25 cmd.Stdin = os.Stdin 26 err = cmd.Run() 27 if err == nil && out.String() != "" { 28 version = strings.TrimSpace(out.String()) 29 } 30 } 31 return version, buildTime 32 } 33 34 func (b *Builder) buildBin() error { 35 buildArgs := []string{"build", "-i"} 36 if b.Debug { 37 buildArgs = append(buildArgs, "-v") 38 } 39 if len(b.Tags) > 0 { 40 buildArgs = append(buildArgs, "-tags", strings.Join(b.Tags, " ")) 41 } 42 43 buildArgs = append(buildArgs, "-o", b.Bin) 44 45 version, buildTime := version() 46 flags := []string{ 47 fmt.Sprintf("-X main.BuildVersion=%s", version), 48 fmt.Sprintf("-X main.BuildTime=%s", buildTime), 49 } 50 51 if b.Static { 52 flags = append(flags, "-linkmode external", "-extldflags \"-static\"") 53 } 54 55 // Add any additional ldflags passed in to the build args 56 if len(b.LDFlags) > 0 { 57 if foundVersion, _ := regexp.MatchString("-X\\s+main.version=", b.LDFlags); foundVersion { 58 return errors.New("the ldflag option '-X main.version=' is reserved for Buffalo use") 59 } 60 if foundBuildTime, _ := regexp.MatchString("-X\\s+main.buildTime=", b.LDFlags); foundBuildTime { 61 return errors.New("the ldflag option '-X main.buildTime=' is reserved for Buffalo use") 62 } 63 flags = append(flags, b.LDFlags) 64 } 65 66 buildArgs = append(buildArgs, "-ldflags", strings.Join(flags, " ")) 67 68 return b.exec(envy.Get("GO_BIN", "go"), buildArgs...) 69 }