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  }