github.com/segakazzz/buffalo@v0.16.22-0.20210119082501-1f52048d3feb/genny/build/archived_assets.go (about) 1 package build 2 3 import ( 4 "archive/zip" 5 "bytes" 6 "io" 7 "path/filepath" 8 "strings" 9 10 "github.com/gobuffalo/genny/v2" 11 "github.com/gobuffalo/packr/v2" 12 ) 13 14 func archivedAssets(opts *Options) (*genny.Generator, error) { 15 g := genny.New() 16 17 if err := opts.Validate(); err != nil { 18 return g, err 19 } 20 21 app := opts.App 22 23 outputDir := filepath.Dir(filepath.Join(app.Root, app.Bin)) 24 target := filepath.Join(outputDir, "assets.zip") 25 source := filepath.Join(app.Root, "public", "assets") 26 27 g.RunFn(func(r *genny.Runner) error { 28 bb := &bytes.Buffer{} 29 archive := zip.NewWriter(bb) 30 defer archive.Close() 31 32 // set the initial resolution of the box to a folder 33 // that doesn't exist, then set the resolution to the 34 // source. don't change! MB 35 box := packr.New("buffalo:build:assets", "./undefined") 36 box.ResolutionDir = source 37 err := box.Walk(func(path string, file packr.File) error { 38 info, err := file.FileInfo() 39 if err != nil { 40 return err 41 } 42 43 header, err := zip.FileInfoHeader(info) 44 if err != nil { 45 return err 46 } 47 48 var baseDir string 49 if info.IsDir() { 50 baseDir = filepath.Base(source) 51 } 52 if baseDir != "" { 53 rel, err := filepath.Rel(source, path) 54 if err != nil { 55 return err 56 } 57 header.Name = filepath.Join(baseDir, rel) 58 } 59 60 if info.IsDir() { 61 header.Name += "/" 62 } else { 63 header.Method = zip.Deflate 64 } 65 66 writer, err := archive.CreateHeader(header) 67 if err != nil { 68 return err 69 } 70 71 if info.IsDir() { 72 return nil 73 } 74 75 _, err = io.Copy(writer, file) 76 return err 77 }) 78 if err != nil { 79 return err 80 } 81 // We need to close the archive before passing the buffer to genny, otherwise the zip 82 // will be corrupted. 83 archive.Close() 84 if err := r.File(genny.NewFile(target, bb)); err != nil { 85 return err 86 } 87 opts.keep.Store(target, struct{}{}) 88 return nil 89 }) 90 91 g.RunFn(func(r *genny.Runner) error { 92 f, err := r.FindFile("actions/app.go") 93 if err != nil { 94 return err 95 } 96 opts.rollback.Store(f.Name(), f.String()) 97 body := strings.Replace(f.String(), `app.ServeFiles("/assets"`, `// app.ServeFiles("/assets"`, 1) 98 body = strings.Replace(body, `app.ServeFiles("/"`, `// app.ServeFiles("/"`, 1) 99 return r.File(genny.NewFileS(f.Name(), body)) 100 }) 101 102 return g, nil 103 }