func addCommander(pm *PluginManager) { pm.Add("commandWatch", func(config *BuildConfig, options Plugins, c chan bool) { /*Expects to receive a plugin config follow this format tag: dirWatch config: path: "./static/less" args: - lessc ./static/less/main.less ./static/css/main.css - lessc ./static/less/svg.less ./static/css/svg.css where the config.path is the path to be watched */ //get the current directory pwd, _ := os.Getwd() //get the dir we should watch dir := options.Config["path"] //get the command we should run on change commands := options.Args if dir == "" { fmt.Printf("---> dirWatch.error: no path set in config map for plug") return } //get the absolute path absDir := filepath.Join(pwd, dir) //create the file watcher watcher := fs.Watch(fs.WatchConfig{ Path: absDir, }) watcher.React(flux.SimpleMuxer(func(root flux.Reactor, data interface{}) { if ev, ok := data.(fsnotify.Event); ok { fmt.Printf("--> commandWatch:File as changed: %+s\n", ev.String()) } }), true) // create the command runner set to run the args watcher.Bind(builders.CommandLauncher(commands), true) flux.GoDefer("CommandWatch:kill", func() { <-c watcher.Close() }) }) }
func addGoStaticBundle(pm *PluginManager) { pm.Add("goStatic", func(config *BuildConfig, options Plugins, c chan bool) { /*Expects to receive a plugin config follow this format: you can control all aspects of the assets.BindFS using the following tag: gostatic # add commands to run on file changes args: - touch ./templates/smirf.go config: in: ./markdown out: ./templates package: smirf file: smirf gzipped: true nodecompression: true production: true // generally you want to leave this to the cli to set where the config.path is the path to be watched */ //get the current directory pwd, _ := os.Getwd() //get the dir we should watch inDir := options.Config["in"] outDir := options.Config["out"] packageName := options.Config["package"] fileName := options.Config["file"] ignore := options.Config["ignore"] absDir := filepath.Join(pwd, inDir) absFile := filepath.Join(pwd, outDir, fileName+".go") if inDir == "" || outDir == "" || packageName == "" || fileName == "" { fmt.Println("---> goStatic.error: the following keys(in,out,package,file) must not be empty") return } //set up the boolean values var prod bool var gzip bool var nodcom bool var err error if gz, err := strconv.ParseBool(options.Config["gzipped"]); err == nil { gzip = gz } else { if config.Mode > 0 { gzip = true } } if br, err := strconv.ParseBool(options.Config["nodecompression"]); err == nil { nodcom = br } if pr, err := strconv.ParseBool(options.Config["production"]); err == nil { prod = pr } else { if config.Mode <= 0 { prod = false } else { prod = true } } var ignoreReg *regexp.Regexp if ignore != "" { ignoreReg = regexp.MustCompile(ignore) } gostatic, err := builders.BundleAssets(&assets.BindFSConfig{ InDir: inDir, OutDir: outDir, Package: packageName, File: fileName, Gzipped: gzip, NoDecompression: nodcom, Production: prod, }) if err != nil { fmt.Printf("---> goStatic.error: %s", err) return } gostatic.React(func(root flux.Reactor, err error, data interface{}) { fmt.Printf("--> goStatic.Reacted: State %t Error: (%+s)\n", data, err) }, true) //bundle up the assets for the main time gostatic.Send(true) var command []string if prod { if runtime.GOOS != "windows" { command = append(command, fmt.Sprintf("touch %s", absFile)) } else { command = append(command, fmt.Sprintf("copy /b %s+,,", absFile)) // command = append(command, fmt.Sprintf("powershell (ls %s).LastWriteTime = Get-Date", absFile)) } } //add the args from the options command = append(command, options.Args...) // log.Printf("command %s", command) //adds a CommandLauncher to touch the output file to force a file change notification touchCommand := builders.CommandLauncher(command) gostatic.Bind(touchCommand, true) //create the file watcher watcher := fs.Watch(fs.WatchConfig{ Path: absDir, Validator: func(path string, info os.FileInfo) bool { if ignoreReg != nil && ignoreReg.MatchString(path) { return false } return true }, }) // create the command runner set to run the args watcher.Bind(gostatic, true) watcher.React(flux.SimpleMuxer(func(root flux.Reactor, data interface{}) { if ev, ok := data.(fsnotify.Event); ok { fmt.Printf("--> goStatic:File as changed: %+s\n", ev.String()) } }), true) flux.GoDefer("goStatic:kill", func() { <-c gostatic.Close() }) }) }
func addGoFriday(pm *PluginManager) { pm.Add("goFriday", func(config *BuildConfig, options Plugins, c chan bool) { /*Expects to receive a plugin config follow this format tag: gofriday config: markdown: ./markdown templates: ./templates where the config.path is the path to be watched */ //get the current directory pwd, _ := os.Getwd() //get the dir we should watch markdownDir := options.Config["markdown"] templateDir := options.Config["templates"] //optional args ext := options.Config["ext"] //must be a bool sanitizeString := options.Config["sanitize"] var sanitize bool if svz, err := strconv.ParseBool(sanitizeString); err == nil { sanitize = svz } if markdownDir == "" || templateDir == "" { fmt.Println("---> gofriday.error: expected to find keys (markdown and templates) in config map") return } //get the absolute path absDir := filepath.Join(pwd, markdownDir) tbsDir := filepath.Join(pwd, templateDir) gofriday, err := builders.GoFridayStream(builders.MarkStreamConfig{ InputDir: absDir, SaveDir: tbsDir, Ext: ext, Sanitize: sanitize, }) if err != nil { fmt.Printf("---> gofriday.error: %s", err) return } //create the file watcher watcher := fs.Watch(fs.WatchConfig{ Path: absDir, }) watcher.React(flux.SimpleMuxer(func(root flux.Reactor, data interface{}) { if ev, ok := data.(fsnotify.Event); ok { fmt.Printf("--> goFriday:File as changed: %+s\n", ev.String()) } }), true) // create the command runner set to run the args watcher.Bind(gofriday, true) flux.GoDefer("goFiday:kill", func() { <-c watcher.Close() }) }) }