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  }