// 此处路径表示 项目里面的一个路径 func MustBuildTplInDirWithCache(root string) { root = kmgConfig.DefaultEnv().PathInProject(root) cachedFileList := cacheFileFilter(root) kmgCache.MustMd5FileChangeCache("kmgGoTpl_"+root, cachedFileList, func() { MustBuildTplInPathList(cachedFileList) }) }
func MustBuildTplWithPath(path string) { kmgCache.MustMd5FileChangeCache("tpl_"+kmgBase64.Base64EncodeStringToString(path), []string{path}, func() { fmt.Println("build tpl at " + path) err := gorazor.GenFolder(path, path, gorazor.Option{"NameNotChange": true}) if err != nil { panic(err) } }) }
func runFileHttpServer() { listenAddr := "" path := "" key := "" flag.StringVar(&listenAddr, "l", ":80", "listen address") flag.StringVar(&path, "path", "", "root path of the file server") flag.StringVar(&key, "key", "", "crypto key use to encrypt all request of this server") flag.Parse() var err error if path == "" { path, err = os.Getwd() if err != nil { fmt.Printf("os.Getwd() fail %s", err) return } } else { kmgErr.PanicIfError(os.Chdir(path)) } if key == "" { http.Handle("/", http.FileServer(http.Dir(path))) } if key != "" { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { realPath := filepath.Join(path, r.URL.Path) if !kmgFile.MustFileExist(realPath) { w.Write([]byte("File Not Exist")) return } if !kmgStrings.IsInSlice(cacheFilePathSlice, realPath) { cacheFilePathSlice = append(cacheFilePathSlice, realPath) } updateCache := func() { cacheFilePathEncryptMap[realPath] = kmgCrypto.CompressAndEncryptBytesEncodeV2( kmgCrypto.Get32PskFromString(key), kmgFile.MustReadFile(realPath), ) } checkCache := func() { lock.Lock() defer lock.Unlock() kmgCache.MustMd5FileChangeCache(realPath, []string{realPath}, func() { updateCache() }) } checkCache() //进程重启后,内存中的缓存掉了,但是文件系统的缓存还在 _, exist := cacheFilePathEncryptMap[realPath] if !exist { updateCache() } w.Write(cacheFilePathEncryptMap[realPath]) }) } fmt.Println("start server at", listenAddr) err = http.ListenAndServe(listenAddr, nil) if err != nil { fmt.Printf("http.ListenAndServe() fail %s", err) return } return }
// 使用缓存 生成代码 func MustGenerateCodeWithCache(req *GenerateRequest) { pkgFilePath := kmgConfig.DefaultEnv().PathInProject(filepath.Join("src", req.ObjectPkgPath)) kmgCache.MustMd5FileChangeCache("kmgRpc_"+req.OutFilePath, []string{req.OutFilePath, pkgFilePath}, func() { MustGenerateCode(req) }) }