game_sync/tools/proto2js/protoconvert2ts.go

210 lines
5.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"encoding/json"
"fmt"
"os"
"os/exec"
"path"
"strings"
)
type Conf struct {
SrcPath string `json:"srcPath"`
DestPath string `json:"destPath"`
CmdPath string `json:cmdPath`
MapCc []string `json:mapCc`
}
// 判断路径是否存在
func pathExist(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
/*
传入参数 all 则转换 protocol目录下的所有文件
如果传入模块名字 则转换模块名字的 proto文件
*/
func main() {
//args := os.Args
//if len(args) < 1 {
// fmt.Println("[all | module name]")
// return
//}
//读取当前目录下的配置文件
fileBuffer, err := os.ReadFile("./config.json")
if err != nil {
fmt.Println("获取srcpath和destpath发生错误")
return
}
var c Conf
e := json.Unmarshal(fileBuffer, &c)
if e != nil {
fmt.Println("从配置文件中获取srcpath和destpath发生错误")
}
//fmt.Println("源路径为:%s", c.SrcPath)
//fmt.Println("目标路径为:%s", c.DestPath)
//判定源路径是否存在
srcstat, _ := pathExist(c.SrcPath)
if !srcstat {
fmt.Println("源路径不存在,无法执行转换")
}
deststate, _ := pathExist(c.DestPath)
if !deststate {
fmt.Println("目标路径不存在,请修改配置文件")
}
var mapCc = make(map[string]int)
if len(c.MapCc) > 0 {
for _, v := range c.MapCc {
mapCc[v] = 0
}
}
moduleName := "all"
if moduleName == "all" {
//遍历目录 所有目录都执行转换
fileInfo, dirErr := os.ReadDir(c.SrcPath)
if dirErr != nil {
fmt.Println("遍历源目录出现错误")
}
for _, v := range fileInfo {
if _, ok := mapCc[v.Name()]; ok && v.IsDir() {
doConvert(c.CmdPath, c.DestPath, c.SrcPath, v.Name())
}
}
} else {
//转换单个模块
doConvert(c.CmdPath, c.DestPath, c.SrcPath, moduleName)
}
}
func doConvert(cmdPath string, dPath string, sPath string, name string) {
destPath := path.Join(dPath, name)
srcPath := path.Join(sPath, name)
if isExist, _ := pathExist(destPath); isExist {
os.RemoveAll(destPath)
}
os.Mkdir(destPath, os.ModePerm)
if isExist, _ := pathExist(srcPath); !isExist {
fmt.Println("要转换的模块不存在")
return
}
//str := "%s/pbjs --target static-module --no-convert --no-delimited --wrap closure --no-beautify --no-create --force-number --no-verify -o %s/%s.js %s/*.proto"
str := "%s/pbjs --dependency protobufjs/minimal.js --no-service --no-convert --no-delimited --no-create --no-beautify --no-verify --target static-module --wrap commonjs --out %s/%s.js %s/*.proto"
cmdStr := fmt.Sprintf(str, cmdPath, destPath, name, srcPath)
//fmt.Println("转换为js")
//fmt.Println(cmdStr)
cmd := exec.Command("cmd.exe", "/C", cmdStr)
if err := cmd.Run(); err != nil {
fmt.Printf("转换%s proto to js 错误", name)
}
//这个地方需要将js中内容以字符串的形式读取出来然后
coverJsFile(destPath, name)
//fmt.Println("转化ts")
//str = "%s/pbts --no-comments --main -o %s/%s.d.ts %s/%s.js"
str = "%s/pbts.cmd --main --out %s/" + name + ".d.ts %s/" + name + ".js"
cmdStr = fmt.Sprintf(str, cmdPath, destPath, destPath)
cmd = exec.Command("cmd.exe", "/C", cmdStr)
//
if err := cmd.Run(); err != nil {
fmt.Println("转换 js to ts 错误", name)
}
convrTsFile(destPath, name)
//重新生成js。为了生成ts则必须有注释。在生成ts后重新生成一下js去掉注释
//str = "%s/pbjs --target static-module --no-convert --no-delimited --no-comments --wrap closure --no-beautify --no-create --force-number --no-verify -o %s/%s.js %s/*.proto"
str = "%s/pbjs --dependency protobufjs/minimal.js --no-service --no-convert --no-comments --no-delimited --no-create --no-beautify --no-verify --target static-module --wrap commonjs --out %s/%s.js %s/*.proto"
cmdStr = fmt.Sprintf(str, cmdPath, destPath, name, srcPath)
//fmt.Println("重新转换为js")
//fmt.Println(cmdStr)
cmd = exec.Command("cmd.exe", "/C", cmdStr)
if err := cmd.Run(); err != nil {
fmt.Println("重新去掉注释转换%s proto to js 错误", name)
}
//copy *.proto
str = "copy %s/*.proto %s/"
cmdStr = fmt.Sprintf(str, srcPath, destPath)
cmd = exec.Command("powershell.exe", "/C", cmdStr)
if err := cmd.Run(); err != nil {
fmt.Println("copy err:", err)
}
//这个地方需要将js中内容以字符串的形式读取出来然后
coverJsFile(destPath, name)
fmt.Printf("cc %-15s to js 完成 \n", name)
}
// 覆盖filePath对应的文本文件
func coverJsFile(filePath string, name string) {
by, err := os.ReadFile(filePath + "/" + name + ".js")
if err != nil {
fmt.Printf("覆盖文件%s出现错误/n", name)
return
}
s := string(by)
startStr := `(function($protobuf)`
//targetStr := fmt.Sprintf("(window || global).%s = (function($protobuf)", name)
targetStr := fmt.Sprintf("module.exports.%s=(function($protobuf)", name)
s = strings.Replace(s, startStr, targetStr, 1)
endStr := `(protobuf)`
endTargetStr := fmt.Sprintf("%s.%s", "(protobuf)", name)
s = strings.Replace(s, endStr, endTargetStr, 1)
f, err := os.OpenFile(filePath+"/"+name+".js", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
if err != nil {
fmt.Println("覆盖写文件出现错误")
return
}
defer f.Close()
f.WriteString(s)
}
func convrTsFile(filePath string, name string) {
by, err := os.ReadFile(filePath + "/" + name + ".d.ts")
if err != nil {
fmt.Println("覆盖TS文件%s错误", name)
return
}
s := string(by)
//temple := `declare global {
// %s
//}
//export {}`
//temple = fmt.Sprintf(temple, s)
temple := s
f, err := os.OpenFile(filePath+"/"+name+".d.ts", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
if err != nil {
fmt.Println("覆盖TS文件发生错误%s", name)
return
}
defer f.Close()
f.WriteString(temple)
}