github.com/nozzle/golangci-lint@v1.49.0-nz3/pkg/goutil/env.go (about) 1 package goutil 2 3 import ( 4 "context" 5 "encoding/json" 6 "os" 7 "os/exec" 8 "strings" 9 "time" 10 11 "github.com/pkg/errors" 12 13 "github.com/golangci/golangci-lint/pkg/logutils" 14 ) 15 16 type EnvKey string 17 18 const ( 19 EnvGoCache EnvKey = "GOCACHE" 20 EnvGoRoot EnvKey = "GOROOT" 21 ) 22 23 type Env struct { 24 vars map[string]string 25 log logutils.Log 26 debugf logutils.DebugFunc 27 } 28 29 func NewEnv(log logutils.Log) *Env { 30 return &Env{ 31 vars: map[string]string{}, 32 log: log, 33 debugf: logutils.Debug(logutils.DebugKeyEnv), 34 } 35 } 36 37 func (e *Env) Discover(ctx context.Context) error { 38 startedAt := time.Now() 39 args := []string{"env", "-json"} 40 args = append(args, string(EnvGoCache), string(EnvGoRoot)) 41 out, err := exec.CommandContext(ctx, "go", args...).Output() 42 if err != nil { 43 return errors.Wrap(err, "failed to run 'go env'") 44 } 45 46 if err = json.Unmarshal(out, &e.vars); err != nil { 47 return errors.Wrapf(err, "failed to parse 'go %s' json", strings.Join(args, " ")) 48 } 49 50 e.debugf("Read go env for %s: %#v", time.Since(startedAt), e.vars) 51 return nil 52 } 53 54 func (e Env) Get(k EnvKey) string { 55 envValue := os.Getenv(string(k)) 56 if envValue != "" { 57 return envValue 58 } 59 60 return e.vars[string(k)] 61 }