github.com/gobuffalo/buffalo-cli/v2@v2.0.0-alpha.15.0.20200919213536-a7350c8e6799/cli/cmds/build/gobuild.go (about) 1 package build 2 3 import ( 4 "context" 5 "os/exec" 6 "path/filepath" 7 "runtime" 8 "strings" 9 10 "github.com/gobuffalo/here" 11 "github.com/gobuffalo/plugins" 12 "github.com/gobuffalo/plugins/plugio" 13 ) 14 15 func (bc *Cmd) buildArgs(ctx context.Context, root string) ([]string, error) { 16 args := []string{"build"} 17 18 info, err := here.Dir(root) 19 if err != nil { 20 return nil, plugins.Wrap(bc, err) 21 } 22 23 bin := bc.bin 24 if len(bin) == 0 { 25 bin = filepath.Join("bin", info.Name) 26 } 27 28 if runtime.GOOS == "windows" { 29 if !strings.HasSuffix(bin, ".exe") { 30 bin += ".exe" 31 } 32 bin = strings.Replace(bin, "/", "\\", -1) 33 } else { 34 bin = strings.TrimSuffix(bin, ".exe") 35 } 36 args = AppendArg(args, "-o", bin) 37 38 if len(bc.mod) != 0 { 39 args = AppendArg(args, "-mod", bc.mod) 40 } 41 42 args = append(args, bc.buildFlags...) 43 44 flags := []string{} 45 if bc.static { 46 flags = append(flags, "-linkmode external", "-extldflags \"-static\"") 47 } 48 49 // Add any additional ldflags passed in to the build args 50 if len(bc.ldFlags) > 0 { 51 flags = append(flags, bc.ldFlags) 52 } 53 if len(flags) > 0 { 54 args = AppendArg(args, "-ldflags", flags...) 55 } 56 57 if len(bc.tags) > 0 { 58 args = AppendArg(args, "-tags", bc.tags) 59 } 60 61 for _, p := range bc.ScopedPlugins() { 62 if bt, ok := p.(BuildArger); ok { 63 ags, err := bt.GoBuildArgs(ctx, root, args) 64 if err != nil { 65 return nil, err 66 } 67 68 switch len(ags) { 69 case 0: 70 continue 71 case 1: 72 args = AppendArg(args, ags[0]) 73 default: 74 args = AppendArg(args, ags[0], ags[1:]...) 75 } 76 77 } 78 } 79 80 return args, nil 81 } 82 83 func (bc *Cmd) build(ctx context.Context, root string) error { 84 buildArgs, err := bc.buildArgs(ctx, root) 85 if err != nil { 86 return plugins.Wrap(bc, err) 87 } 88 89 rinfo, err := here.Dir(root) 90 if err != nil { 91 return plugins.Wrap(bc, err) 92 } 93 94 folder := "." + string(filepath.Separator) + filepath.Join("cmd", strings.ToLower(rinfo.Name)) 95 buildArgs = append(buildArgs, folder) 96 97 plugs := bc.ScopedPlugins() 98 cmd := exec.CommandContext(ctx, "go", buildArgs...) 99 cmd.Stdin = plugio.Stdin(plugs...) 100 cmd.Stdout = plugio.Stdout(plugs...) 101 cmd.Stderr = plugio.Stderr(plugs...) 102 103 for _, p := range plugs { 104 if br, ok := p.(GoBuilder); ok { 105 err := br.GoBuild(ctx, root, cmd) 106 return plugins.Wrap(br, err) 107 } 108 } 109 110 return cmd.Run() 111 }