env.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package env
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  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. GoctlExperimental = "GOCTL_EXPERIMENTAL"
  25. ProtocVersion = "PROTOC_VERSION"
  26. ProtocGenGoVersion = "PROTOC_GEN_GO_VERSION"
  27. ProtocGenGoGRPCVersion = "PROTO_GEN_GO_GRPC_VERSION"
  28. envFileDir = "env"
  29. ExperimentalOn = "on"
  30. ExperimentalOff = "off"
  31. )
  32. // init initializes the goctl environment variables, the environment variables of the function are set in order,
  33. // please do not change the logic order of the code.
  34. func init() {
  35. defaultGoctlHome, err := pathx.GetDefaultGoctlHome()
  36. if err != nil {
  37. log.Fatalln(err)
  38. }
  39. goctlEnv = sortedmap.New()
  40. goctlEnv.SetKV(GoctlOS, runtime.GOOS)
  41. goctlEnv.SetKV(GoctlArch, runtime.GOARCH)
  42. existsEnv := readEnv(defaultGoctlHome)
  43. if existsEnv != nil {
  44. goctlHome, ok := existsEnv.GetString(GoctlHome)
  45. if ok && len(goctlHome) > 0 {
  46. goctlEnv.SetKV(GoctlHome, goctlHome)
  47. }
  48. if debug := existsEnv.GetOr(GoctlDebug, "").(string); debug != "" {
  49. if strings.EqualFold(debug, "true") || strings.EqualFold(debug, "false") {
  50. goctlEnv.SetKV(GoctlDebug, debug)
  51. }
  52. }
  53. if value := existsEnv.GetStringOr(GoctlCache, ""); value != "" {
  54. goctlEnv.SetKV(GoctlCache, value)
  55. }
  56. experimental := existsEnv.GetOr(GoctlExperimental, ExperimentalOff)
  57. goctlEnv.SetKV(GoctlExperimental, experimental)
  58. }
  59. if !goctlEnv.HasKey(GoctlHome) {
  60. goctlEnv.SetKV(GoctlHome, defaultGoctlHome)
  61. }
  62. if !goctlEnv.HasKey(GoctlDebug) {
  63. goctlEnv.SetKV(GoctlDebug, "False")
  64. }
  65. if !goctlEnv.HasKey(GoctlCache) {
  66. cacheDir, _ := pathx.GetCacheDir()
  67. goctlEnv.SetKV(GoctlCache, cacheDir)
  68. }
  69. if !goctlEnv.HasKey(GoctlExperimental) {
  70. goctlEnv.SetKV(GoctlExperimental, ExperimentalOff)
  71. }
  72. goctlEnv.SetKV(GoctlVersion, version.BuildVersion)
  73. protocVer, _ := protoc.Version()
  74. goctlEnv.SetKV(ProtocVersion, protocVer)
  75. protocGenGoVer, _ := protocgengo.Version()
  76. goctlEnv.SetKV(ProtocGenGoVersion, protocGenGoVer)
  77. protocGenGoGrpcVer, _ := protocgengogrpc.Version()
  78. goctlEnv.SetKV(ProtocGenGoGRPCVersion, protocGenGoGrpcVer)
  79. }
  80. func Print() string {
  81. return strings.Join(goctlEnv.Format(), "\n")
  82. }
  83. func Get(key string) string {
  84. return GetOr(key, "")
  85. }
  86. func GetOr(key, def string) string {
  87. return goctlEnv.GetStringOr(key, def)
  88. }
  89. func UseExperimental() bool {
  90. return GetOr(GoctlExperimental, ExperimentalOff) == ExperimentalOn
  91. }
  92. func readEnv(goctlHome string) *sortedmap.SortedMap {
  93. envFile := filepath.Join(goctlHome, envFileDir)
  94. data, err := os.ReadFile(envFile)
  95. if err != nil {
  96. return nil
  97. }
  98. dataStr := string(data)
  99. lines := strings.Split(dataStr, "\n")
  100. sm := sortedmap.New()
  101. for _, line := range lines {
  102. _, _, err = sm.SetExpression(line)
  103. if err != nil {
  104. continue
  105. }
  106. }
  107. return sm
  108. }
  109. func WriteEnv(kv []string) error {
  110. defaultGoctlHome, err := pathx.GetDefaultGoctlHome()
  111. if err != nil {
  112. log.Fatalln(err)
  113. }
  114. data := sortedmap.New()
  115. for _, e := range kv {
  116. _, _, err := data.SetExpression(e)
  117. if err != nil {
  118. return err
  119. }
  120. }
  121. data.RangeIf(func(key, value any) bool {
  122. switch key.(string) {
  123. case GoctlHome, GoctlCache:
  124. path := value.(string)
  125. if !pathx.FileExists(path) {
  126. err = fmt.Errorf("[writeEnv]: path %q is not exists", path)
  127. return false
  128. }
  129. }
  130. if goctlEnv.HasKey(key) {
  131. goctlEnv.SetKV(key, value)
  132. return true
  133. } else {
  134. err = fmt.Errorf("[writeEnv]: invalid key: %v", key)
  135. return false
  136. }
  137. })
  138. if err != nil {
  139. return err
  140. }
  141. envFile := filepath.Join(defaultGoctlHome, envFileDir)
  142. return os.WriteFile(envFile, []byte(strings.Join(goctlEnv.Format(), "\n")), 0o777)
  143. }