package file import ( "bufio" "fmt" "io" "os" "path/filepath" "strings" ) func NewTemplate(dir, old, new string) error { return ReplacePackage(dir, old, new, []string{"vendor", ".git", ".idea"}) } func ReplacePackageV2(dir string, old []string, ignoreFile []string) error { if old == nil || len(old) == 0 { return nil } files, err := GetAllFiles(dir, func(fileName string) bool { var pass = true if ignoreFile == nil || len(ignoreFile) == 0 { return true } for _, elem := range ignoreFile { if strings.Contains(fileName, elem) { pass = false break } } return pass }) if err != nil { return err } for _, file := range files { err := ModifyFileV2(old, file) if err != nil { return err } } return nil } func ReplacePackage(dir, old, new string, ignoreFile []string) error { files, err := GetAllFiles(dir, func(fileName string) bool { var pass = true if ignoreFile == nil || len(ignoreFile) == 0 { return true } for _, elem := range ignoreFile { if strings.Contains(fileName, elem) { pass = false break } } return pass }) if err != nil { return err } for _, file := range files { err := ModifyFile(old, new, file) if err != nil { return err } } return nil } type FilterFile func(fileName string) bool func GetAllFiles(dirPth string, filter FilterFile) ([]string, error) { files := make([]string, 0) err := filepath.Walk(dirPth, func(path string, info os.FileInfo, err error) error { if info.IsDir() { return nil } if filter(path) { files = append(files, path) } return nil }) if err != nil { return nil, err } return files, nil } func ModifyFile(old, new string, fileName string) error { rfile, err := os.OpenFile(fileName, os.O_RDONLY, os.ModePerm) if err != nil { return err } defer rfile.Close() reader := bufio.NewReader(rfile) fileLine := make([]string, 0) count := 0 for { lines, isEOF, err := reader.ReadLine() if err != nil { if err == io.EOF { break } return err } if isEOF { break } line := string(lines) if strings.Contains(line, old) { count++ fileLine = append(fileLine, strings.ReplaceAll(string(lines), old, new)) } else { fileLine = append(fileLine, line) } } if count == 0 { return nil } wfile, err := os.OpenFile(fileName, os.O_WRONLY|os.O_TRUNC, os.ModePerm) if err != nil { return err } defer wfile.Close() for _, elem := range fileLine { _, err := fmt.Fprintln(wfile, elem) if err != nil { return err } } fmt.Printf("change success : %s\n", fileName) return nil } func ModifyFileV2(old []string, fileName string) error { rfile, err := os.OpenFile(fileName, os.O_RDONLY, os.ModePerm) if err != nil { return err } defer rfile.Close() reader := bufio.NewReader(rfile) fileLine := make([]string, 0) count := 0 for { lines, isEOF, err := reader.ReadLine() if err != nil { if strings.Compare(err.Error(), "EOF") == 0 { break } return err } if isEOF { break } line := string(lines) for _, elem := range old { if strings.Contains(line, elem) { count++ rep := make([]byte, len(elem)) for i, _ := range rep { rep[i] = '*' } fileLine = append(fileLine, strings.ReplaceAll(string(lines), elem, string(rep))) break } else { fileLine = append(fileLine, line) break } } } if count == 0 { return nil } wfile, err := os.OpenFile(fileName, os.O_WRONLY|os.O_TRUNC, os.ModePerm) if err != nil { return err } defer wfile.Close() for _, elem := range fileLine { _, err := fmt.Fprintln(wfile, elem) if err != nil { return err } } fmt.Printf("replace %s success!!!\n", fileName) return nil }