github.com/rafecolton/buffalo@v0.9.5/generators/assets/webpack/webpack.go (about)

     1  package webpack
     2  
     3  import (
     4  	"fmt"
     5  	"os/exec"
     6  	"path/filepath"
     7  
     8  	"github.com/gobuffalo/buffalo/generators"
     9  	"github.com/gobuffalo/buffalo/generators/assets"
    10  	"github.com/gobuffalo/buffalo/generators/assets/standard"
    11  	"github.com/gobuffalo/makr"
    12  	"github.com/pkg/errors"
    13  )
    14  
    15  var logo = &makr.RemoteFile{
    16  	File:       makr.NewFile("assets/images/logo.svg", ""),
    17  	RemotePath: assets.LogoURL,
    18  }
    19  
    20  // BinPath is the path to the local install of webpack
    21  var BinPath = filepath.Join("node_modules", ".bin", "webpack")
    22  
    23  // New webpack generator
    24  func New(data makr.Data) (*makr.Generator, error) {
    25  	g := makr.New()
    26  
    27  	command := "yarn"
    28  
    29  	if b, ok := data["withYarn"].(bool); ok && !b {
    30  		command = "npm"
    31  	} else {
    32  		err := installYarn(data)
    33  		if err != nil {
    34  			return g, errors.WithStack(err)
    35  		}
    36  	}
    37  
    38  	// if there's no npm, return!
    39  	_, err := exec.LookPath("npm")
    40  	if err != nil {
    41  		fmt.Println("Could not find npm. Skipping webpack generation.")
    42  
    43  		wg, err := standard.New(data)
    44  		if err != nil {
    45  			return g, errors.WithStack(err)
    46  		}
    47  		return wg, nil
    48  	}
    49  
    50  	g.Add(logo)
    51  
    52  	files, err := generators.Find(filepath.Join(generators.TemplatesPath, "assets", "webpack"))
    53  	if err != nil {
    54  		return g, err
    55  	}
    56  
    57  	for _, f := range files {
    58  		g.Add(makr.NewFile(f.WritePath, f.Body))
    59  	}
    60  
    61  	args := []string{"install", "--no-progress", "--save"}
    62  	g.Add(makr.NewCommand(exec.Command(command, args...)))
    63  	return g, nil
    64  }
    65  
    66  func installYarn(data makr.Data) error {
    67  	// if there's no yarn, install it!
    68  	_, err := exec.LookPath("yarn")
    69  	// A new makr is necessary to have yarn available in path
    70  	if err != nil {
    71  		yg := makr.New()
    72  		yargs := []string{"install", "-g", "yarn"}
    73  		yg.Add(makr.NewCommand(exec.Command("npm", yargs...)))
    74  		err = yg.Run(".", data)
    75  		if err != nil {
    76  			return err
    77  		}
    78  	}
    79  	return nil
    80  }