github.com/bscott/buffalo@v0.11.1/buffalo/cmd/build/builder.go (about) 1 package build 2 3 import ( 4 "context" 5 "os" 6 7 "github.com/gobuffalo/packr/builder" 8 "github.com/pkg/errors" 9 "github.com/sirupsen/logrus" 10 ) 11 12 // Builder builds a Buffalo binary 13 type Builder struct { 14 Options 15 ctx context.Context 16 steps []func() error 17 cleanups []func() error 18 originals map[string][]byte 19 } 20 21 // New Builder 22 func New(ctx context.Context, opts Options) *Builder { 23 b := &Builder{ 24 ctx: ctx, 25 Options: opts, 26 cleanups: []func() error{}, 27 originals: map[string][]byte{}, 28 } 29 30 b.steps = []func() error{ 31 b.prepTarget, 32 b.validateTemplates, 33 b.transformMain, 34 b.createBuildMain, 35 b.prepAPackage, 36 b.buildAInit, 37 b.buildADatabase, 38 b.buildAssets, 39 b.buildBin, 40 } 41 42 return b 43 } 44 45 // Run builds a Buffalo binary 46 func (b *Builder) Run() error { 47 defer b.Cleanup() 48 logrus.Debug(b.Options) 49 50 for _, s := range b.steps { 51 err := s() 52 if err != nil { 53 return errors.WithStack(err) 54 } 55 os.Chdir(b.Root) 56 } 57 return nil 58 } 59 60 // Cleanup after run. This is automatically run at the end of `Run`. 61 // It is provided publicly in-case a manual clean up is necessary. 62 func (b *Builder) Cleanup() error { 63 builder.Clean(b.Root) 64 me := multiError{} 65 for _, c := range b.cleanups { 66 err := c() 67 if err != nil { 68 me = append(me, errors.Errorf("error while cleaning up: %+v", err)) 69 } 70 } 71 if len(me) > 0 { 72 logrus.Error(me) 73 return me 74 } 75 return nil 76 }