github.com/segakazzz/buffalo@v0.16.22-0.20210119082501-1f52048d3feb/genny/build/build.go (about) 1 package build 2 3 import ( 4 "time" 5 6 "github.com/gobuffalo/buffalo/runtime" 7 8 "github.com/gobuffalo/events" 9 "github.com/gobuffalo/genny/v2" 10 "github.com/gobuffalo/genny/v2/plushgen" 11 "github.com/gobuffalo/packr/v2" 12 "github.com/gobuffalo/packr/v2/jam" 13 "github.com/gobuffalo/plush/v4" 14 ) 15 16 // New generator for building a Buffalo application 17 // This powers the `buffalo build` command and can be 18 // used to programatically build/compile Buffalo 19 // applications. 20 func New(opts *Options) (*genny.Generator, error) { 21 g := genny.New() 22 23 if err := opts.Validate(); err != nil { 24 return g, err 25 } 26 g.ErrorFn = func(err error) { 27 events.EmitError(EvtBuildStopErr, err, events.Payload{"opts": opts}) 28 } 29 30 g.RunFn(func(r *genny.Runner) error { 31 events.EmitPayload(EvtBuildStart, events.Payload{"opts": opts}) 32 return nil 33 }) 34 35 g.Transformer(genny.Dot()) 36 37 // validate templates 38 g.RunFn(ValidateTemplates(templateWalker(opts.App), opts.TemplateValidators)) 39 40 // rename main() to originalMain() 41 g.RunFn(transformMain(opts)) 42 43 // add any necessary templates for the build 44 box := packr.New("github.com/gobuffalo/buffalo@v0.15.6/genny/build", "../build/templates") 45 if err := g.Box(box); err != nil { 46 return g, err 47 } 48 49 // configure plush 50 ctx := plush.NewContext() 51 ctx.Set("opts", opts) 52 ctx.Set("buildTime", opts.BuildTime.Format(time.RFC3339)) 53 ctx.Set("buildVersion", opts.BuildVersion) 54 ctx.Set("buffaloVersion", runtime.Version) 55 g.Transformer(plushgen.Transformer(ctx)) 56 57 // create the ./a pkg 58 ag, err := apkg(opts) 59 if err != nil { 60 return g, err 61 } 62 g.Merge(ag) 63 64 if opts.WithAssets { 65 // mount the assets generator 66 ag, err := assets(opts) 67 if err != nil { 68 return g, err 69 } 70 g.Merge(ag) 71 } 72 73 if opts.WithBuildDeps { 74 // mount the build time dependency generator 75 dg, err := buildDeps(opts) 76 if err != nil { 77 return g, err 78 } 79 g.Merge(dg) 80 } 81 82 g.RunFn(func(r *genny.Runner) error { 83 return jam.Pack(jam.PackOptions{}) 84 }) 85 86 // create the final go build command 87 c, err := buildCmd(opts) 88 if err != nil { 89 return g, err 90 } 91 g.Command(c) 92 93 g.RunFn(Cleanup(opts)) 94 95 g.RunFn(func(r *genny.Runner) error { 96 events.EmitPayload(EvtBuildStop, events.Payload{"opts": opts}) 97 return nil 98 }) 99 return g, nil 100 }