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  }