env.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package env
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "log"
  6. "path/filepath"
  7. "runtime"
  8. "strings"
  9. "github.com/zeromicro/go-zero/tools/goctl/internal/version"
  10. sortedmap "github.com/zeromicro/go-zero/tools/goctl/pkg/collection"
  11. "github.com/zeromicro/go-zero/tools/goctl/pkg/protoc"
  12. "github.com/zeromicro/go-zero/tools/goctl/pkg/protocgengo"
  13. "github.com/zeromicro/go-zero/tools/goctl/pkg/protocgengogrpc"
  14. "github.com/zeromicro/go-zero/tools/goctl/util/pathx"
  15. )
  16. var goctlEnv *sortedmap.SortedMap
  17. const (
  18. GoctlOS = "GOCTL_OS"
  19. GoctlArch = "GOCTL_ARCH"
  20. GoctlHome = "GOCTL_HOME"
  21. GoctlDebug = "GOCTL_DEBUG"
  22. GoctlCache = "GOCTL_CACHE"
  23. GoctlVersion = "GOCTL_VERSION"
  24. ProtocVersion = "PROTOC_VERSION"
  25. ProtocGenGoVersion = "PROTOC_GEN_GO_VERSION"
  26. ProtocGenGoGRPCVersion = "PROTO_GEN_GO_GRPC_VERSION"
  27. envFileDir = "env"
  28. )
  29. // init initializes the goctl environment variables, the environment variables of the function are set in order,
  30. // please do not change the logic order of the code.
  31. func init() {
  32. defaultGoctlHome, err := pathx.GetDefaultGoctlHome()
  33. if err != nil {
  34. log.Fatalln(err)
  35. }
  36. goctlEnv = sortedmap.New()
  37. goctlEnv.SetKV(GoctlOS, runtime.GOOS)
  38. goctlEnv.SetKV(GoctlArch, runtime.GOARCH)
  39. existsEnv := readEnv(defaultGoctlHome)
  40. if existsEnv != nil {
  41. goctlHome, ok := existsEnv.GetString(GoctlHome)
  42. if ok && len(goctlHome) > 0 {
  43. goctlEnv.SetKV(GoctlHome, goctlHome)
  44. }
  45. if debug := existsEnv.GetOr(GoctlDebug, "").(string); debug != "" {
  46. if strings.EqualFold(debug, "true") || strings.EqualFold(debug, "false") {
  47. goctlEnv.SetKV(GoctlDebug, debug)
  48. }
  49. }
  50. if value := existsEnv.GetStringOr(GoctlCache, ""); value != "" {
  51. goctlEnv.SetKV(GoctlCache, value)
  52. }
  53. }
  54. if !goctlEnv.HasKey(GoctlHome) {
  55. goctlEnv.SetKV(GoctlHome, defaultGoctlHome)
  56. }
  57. if !goctlEnv.HasKey(GoctlDebug) {
  58. goctlEnv.SetKV(GoctlDebug, "False")
  59. }
  60. if !goctlEnv.HasKey(GoctlCache) {
  61. cacheDir, _ := pathx.GetCacheDir()
  62. goctlEnv.SetKV(GoctlCache, cacheDir)
  63. }
  64. goctlEnv.SetKV(GoctlVersion, version.BuildVersion)
  65. protocVer, _ := protoc.Version()
  66. goctlEnv.SetKV(ProtocVersion, protocVer)
  67. protocGenGoVer, _ := protocgengo.Version()
  68. goctlEnv.SetKV(ProtocGenGoVersion, protocGenGoVer)
  69. protocGenGoGrpcVer, _ := protocgengogrpc.Version()
  70. goctlEnv.SetKV(ProtocGenGoGRPCVersion, protocGenGoGrpcVer)
  71. }
  72. func Print() string {
  73. return strings.Join(goctlEnv.Format(), "\n")
  74. }
  75. func Get(key string) string {
  76. return GetOr(key, "")
  77. }
  78. func GetOr(key, def string) string {
  79. return goctlEnv.GetStringOr(key, def)
  80. }
  81. func readEnv(goctlHome string) *sortedmap.SortedMap {
  82. envFile := filepath.Join(goctlHome, envFileDir)
  83. data, err := ioutil.ReadFile(envFile)
  84. if err != nil {
  85. return nil
  86. }
  87. dataStr := string(data)
  88. lines := strings.Split(dataStr, "\n")
  89. sm := sortedmap.New()
  90. for _, line := range lines {
  91. _, _, err = sm.SetExpression(line)
  92. if err != nil {
  93. continue
  94. }
  95. }
  96. return sm
  97. }
  98. func WriteEnv(kv []string) error {
  99. defaultGoctlHome, err := pathx.GetDefaultGoctlHome()
  100. if err != nil {
  101. log.Fatalln(err)
  102. }
  103. data := sortedmap.New()
  104. for _, e := range kv {
  105. _, _, err := data.SetExpression(e)
  106. if err != nil {
  107. return err
  108. }
  109. }
  110. data.RangeIf(func(key, value interface{}) bool {
  111. switch key.(string) {
  112. case GoctlHome, GoctlCache:
  113. path := value.(string)
  114. if !pathx.FileExists(path) {
  115. err = fmt.Errorf("[writeEnv]: path %q is not exists", path)
  116. return false
  117. }
  118. }
  119. if goctlEnv.HasKey(key) {
  120. goctlEnv.SetKV(key, value)
  121. return true
  122. } else {
  123. err = fmt.Errorf("[writeEnv]: invalid key: %v", key)
  124. return false
  125. }
  126. })
  127. if err != nil {
  128. return err
  129. }
  130. envFile := filepath.Join(defaultGoctlHome, envFileDir)
  131. return ioutil.WriteFile(envFile, []byte(strings.Join(goctlEnv.Format(), "\n")), 0o777)
  132. }