main.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package main
  2. import (
  3. "encoding/json"
  4. "flag"
  5. "fmt"
  6. "os"
  7. "os/exec"
  8. "path/filepath"
  9. "strings"
  10. "gitea.ckfah.com/go-script/logger"
  11. "gitea.ckfah.com/go-script/orm"
  12. )
  13. const (
  14. generatorVersion = "1.0.0"
  15. successExit = -1
  16. )
  17. var (
  18. config *DBConfig = new(DBConfig)
  19. )
  20. var (
  21. configFile string
  22. help bool
  23. showVersion bool
  24. destDir string
  25. modelPackageName string
  26. daoPackageName string
  27. dtoPackageName string
  28. tableNames strFlags
  29. dbType string
  30. tags strFlags
  31. dbName string
  32. dbHost string
  33. dbPort int
  34. dbUserName string
  35. dbPassword string
  36. dbCharset string
  37. )
  38. type strFlags []string
  39. func (i *strFlags) String() string {
  40. return "table names"
  41. }
  42. func (i *strFlags) Set(value string) error {
  43. *i = append(*i, value)
  44. return nil
  45. }
  46. func init() {
  47. flag.BoolVar(&help, "h", false, "this help")
  48. flag.BoolVar(&showVersion, "v", false, "generator version")
  49. flag.StringVar(&dbType, "db_type", "mysql", "database type, eg: -db_type=mysql")
  50. flag.StringVar(&dbName, "d", "", "database name, eg: -d=xorm")
  51. flag.StringVar(&dbHost, "host", "localhost", "database host, eg: -port=localhost")
  52. flag.IntVar(&dbPort, "port", 3306, "database port, eg: -port=3306")
  53. flag.StringVar(&dbUserName, "u", "root", "database username, eg: -u=root")
  54. flag.StringVar(&dbPassword, "p", "123456", "database password, eg: -p=123456")
  55. flag.Var(&tableNames, "t", "database table names default all tables , eg: -t=class -t=user")
  56. flag.StringVar(&dbCharset, "charset", "utf8", "database table names, eg: -charset=utf8")
  57. flag.Var(&tags, "tag", "modle tag names support add many tags,default xorm, eg: -tag=xorm -tag=json")
  58. flag.StringVar(&configFile, "config", "", "orm config file, the shell instrument is priority than config file")
  59. flag.StringVar(&destDir, "dir", "./tmp", "generated directory default ./tmp, eg: -dir=./tmp")
  60. flag.StringVar(&modelPackageName, "model_package", "model", "package name default model, eg:-model_package=model")
  61. flag.StringVar(&daoPackageName, "dao_package", "dao", "package name default dao, eg:-dao_package=dao")
  62. flag.StringVar(&dtoPackageName, "dto_package", "dto", "package name default dao, eg:-dto_package=dao")
  63. }
  64. func main() {
  65. initConfig("go-orm-config.json", true, false)
  66. // 解析输入
  67. initFlag()
  68. if configFile != "" {
  69. initConfig(configFile, false, true)
  70. }
  71. // 初始化属性
  72. config := initProperties()
  73. err := config.Generator()
  74. if err != nil {
  75. logger.FatalF("generate fail,err=%s", err)
  76. }
  77. fmt.Println("generate template finished")
  78. }
  79. func GetRootPath() string {
  80. curFilename := os.Args[0]
  81. binaryPath, err := exec.LookPath(curFilename)
  82. if err != nil {
  83. panic(err)
  84. }
  85. binaryPath, err = filepath.Abs(binaryPath)
  86. if err != nil {
  87. panic(err)
  88. }
  89. return filepath.Dir(binaryPath)
  90. }
  91. // 是否忽略error
  92. func initConfig(fileName string, fail, asb bool) {
  93. if !asb {
  94. fileName = filepath.Clean(fmt.Sprintf("%s/%s", GetRootPath(), fileName))
  95. }
  96. file, err := os.Open(fileName)
  97. fmt.Println(fmt.Sprintf("load config %s", fileName))
  98. if err != nil {
  99. if fail {
  100. return
  101. }
  102. logger.FatalF("not fond config-file", err)
  103. }
  104. err = json.NewDecoder(file).Decode(config)
  105. if err != nil {
  106. bytes, _ := json.Marshal(config)
  107. logger.InfoF(`
  108. your config should be as follow:
  109. %s
  110. `, bytes)
  111. logger.FatalF("decode config-file err,err=%s", err)
  112. }
  113. reloadConfig()
  114. }
  115. // 初始化属性
  116. func initProperties() *orm.Config {
  117. config := new(orm.Config)
  118. config.DbType = orm.GetDbType(dbType)
  119. config.DbName = dbName
  120. config.DbUserName = dbUserName
  121. config.DbPassword = dbPassword
  122. config.DbHost = dbHost
  123. config.DbPort = dbPort
  124. config.DbCharset = dbCharset
  125. config.GeneratorModel = true
  126. config.GeneratorDao = true
  127. config.GeneratorDto = true
  128. config.DaoPackageName = daoPackageName
  129. config.ModelPackageName = modelPackageName
  130. config.DtoPackageName = dtoPackageName
  131. config.Tags = addTag(tags)
  132. config.SaveFile = destDir
  133. config.TableNames = tableNames
  134. return config
  135. }
  136. // 指示
  137. func initFlag() {
  138. flag.Parse()
  139. if help {
  140. fmt.Println(`generator version: anthony/1.0.0
  141. Usage: generator -host=localhost -port=3306 -d=urban_v -u=root -p=123456 -t=class -t=student -tag=xorm -dir=./tmp
  142. Option:`)
  143. flag.PrintDefaults()
  144. os.Exit(successExit)
  145. }
  146. if showVersion {
  147. fmt.Printf("generator version: anthony/%s", generatorVersion)
  148. os.Exit(successExit)
  149. }
  150. }
  151. func addTag(tags strFlags) []string {
  152. str := "xorm"
  153. result := make([]string, 0)
  154. result = append(result, str)
  155. for _, e := range tags {
  156. if strings.Compare(str, e) == 0 {
  157. continue
  158. }
  159. result = append(result, e)
  160. }
  161. return result
  162. }
  163. func reloadConfig() {
  164. dbType = config.DbType
  165. tags = config.Tags
  166. dbName = config.DbName
  167. dbHost = config.DbHost
  168. dbPort = config.DbPort
  169. dbUserName = config.DbUserName
  170. dbPassword = config.DbPassword
  171. dbCharset = config.DbCharset
  172. }
  173. type DBConfig struct {
  174. DbType string `json:"db_type"`
  175. Tags strFlags `json:"tags"`
  176. DbName string `json:"db_name"`
  177. DbHost string `json:"db_host"`
  178. DbPort int `json:"db_port"`
  179. DbUserName string `json:"db_user_name"`
  180. DbPassword string `json:"db_password"`
  181. DbCharset string `json:"db_charset"`
  182. }