github.com/segakazzz/buffalo@v0.16.22-0.20210119082501-1f52048d3feb/genny/build/assets.go (about)

     1  package build
     2  
     3  import (
     4  	"bytes"
     5  	"os/exec"
     6  	"path/filepath"
     7  
     8  	"github.com/gobuffalo/buffalo/genny/assets/webpack"
     9  	"github.com/gobuffalo/envy"
    10  	"github.com/gobuffalo/genny/v2"
    11  
    12  	"github.com/gobuffalo/packr/v2/jam"
    13  	"github.com/gobuffalo/packr/v2/jam/parser"
    14  )
    15  
    16  func assets(opts *Options) (*genny.Generator, error) {
    17  	g := genny.New()
    18  
    19  	if err := opts.Validate(); err != nil {
    20  		return g, err
    21  	}
    22  
    23  	if opts.App.WithNodeJs || opts.App.WithWebpack {
    24  		if opts.CleanAssets {
    25  			g.RunFn(func(r *genny.Runner) error {
    26  				r.Delete(filepath.Join(opts.App.Root, "public", "assets"))
    27  				return nil
    28  			})
    29  		}
    30  		g.RunFn(func(r *genny.Runner) error {
    31  			r.Logger.Debugf("setting NODE_ENV = %s", opts.Environment)
    32  			return envy.MustSet("NODE_ENV", opts.Environment)
    33  		})
    34  		g.RunFn(func(r *genny.Runner) error {
    35  			tool := "yarnpkg"
    36  			if !opts.App.WithYarn {
    37  				tool = "npm"
    38  			}
    39  
    40  			c := exec.CommandContext(r.Context, tool, "run", "build")
    41  			if _, err := opts.App.NodeScript("build"); err != nil {
    42  				// Fallback on legacy runner
    43  				c = exec.CommandContext(r.Context, webpack.BinPath)
    44  			}
    45  
    46  			bb := &bytes.Buffer{}
    47  			c.Stdout = bb
    48  			c.Stderr = bb
    49  
    50  			if err := r.Exec(c); err != nil {
    51  				r.Logger.Error(bb.String())
    52  				return err
    53  			}
    54  			return nil
    55  
    56  		})
    57  	}
    58  
    59  	g.RunFn(func(r *genny.Runner) error {
    60  		ro := &parser.RootsOptions{}
    61  
    62  		if !opts.WithAssets {
    63  			ro.Ignores = append(ro.Ignores, "public/assets")
    64  		}
    65  
    66  		opts := jam.PackOptions{
    67  			Roots:        []string{opts.App.Root},
    68  			RootsOptions: ro,
    69  		}
    70  		return jam.Pack(opts)
    71  	})
    72  
    73  	if opts.ExtractAssets && opts.WithAssets {
    74  		// mount the archived assets generator
    75  		aa, err := archivedAssets(opts)
    76  		if err != nil {
    77  			return g, err
    78  		}
    79  		g.Merge(aa)
    80  	}
    81  
    82  	return g, nil
    83  }