github.com/gobuffalo/buffalo-cli/v2@v2.0.0-alpha.15.0.20200919213536-a7350c8e6799/cli/internal/plugins/webpack/build/archive.go (about) 1 package build 2 3 import ( 4 "archive/zip" 5 "context" 6 "io" 7 "os" 8 "path/filepath" 9 "strings" 10 11 "github.com/gobuffalo/plugins" 12 ) 13 14 func (a *Builder) archive(ctx context.Context, root string, args []string) error { 15 if !a.extract { 16 return nil 17 } 18 19 outputDir := a.extractTo 20 if len(a.extractTo) == 0 { 21 outputDir = "bin" 22 } 23 outputDir = filepath.Join(root, outputDir) 24 os.MkdirAll(outputDir, 0755) 25 26 target := filepath.Join(outputDir, "webpack.zip") 27 source := filepath.Join(root, "public", "webpack") 28 29 f, err := os.Create(target) 30 if err != nil { 31 return plugins.Wrap(a, err) 32 } 33 defer f.Close() 34 35 archive := zip.NewWriter(f) 36 defer archive.Close() 37 err = filepath.Walk(source, func(path string, info os.FileInfo, err error) error { 38 if err != nil { 39 return err 40 } 41 header, err := zip.FileInfoHeader(info) 42 if err != nil { 43 return err 44 } 45 46 header.Name = strings.TrimPrefix(path, source) 47 header.Name = strings.TrimPrefix(header.Name, string(filepath.Separator)) 48 49 if info.IsDir() { 50 header.Name += "/" 51 } else { 52 header.Method = zip.Deflate 53 } 54 55 writer, err := archive.CreateHeader(header) 56 if err != nil { 57 return err 58 } 59 60 if info.IsDir() { 61 return nil 62 } 63 64 file, err := os.Open(path) 65 if err != nil { 66 return err 67 } 68 defer file.Close() 69 70 _, err = io.Copy(writer, file) 71 if err != nil { 72 return err 73 } 74 return nil 75 }) 76 77 return plugins.Wrap(a, err) 78 }