210 lines
5.7 KiB
Go
210 lines
5.7 KiB
Go
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)
|
||
}
|