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 }