golang 一些不错的环境变量管理包

joho/godotenv

ruby dotenv 库golang 的移植,功能还是比较强大的,同时支持编码加载变量

  • 参考使用
package main
import (
    "github.com/joho/godotenv"
    "log"
    "os"
)
func main() {
  err := godotenv.Load()
  if err != nil {
    log.Fatal("Error loading .env file")
  }
  s3Bucket := os.Getenv("S3_BUCKET")
  secretKey := os.Getenv("SECRET_KEY")
  // now do something with s3 or whatever
}

a8m/envsubst

支持环境变量的替换

  • 参考使用
package main
import (
  "fmt"
  "github.com/a8m/envsubst"
)
func main() {
    input := "welcom $HOME"
    str, err := envsubst.String(input)
    // ...
    buf, err := envsubst.Bytes([]byte(input))
    // ...
    buf, err := envsubst.ReadFile("filename")
}

Netflix/go-env

支持基于tag 的环境变量处理

  • 参考使用
package main
import (
  "log"
  "time"
  env "github.com/Netflix/go-env"
)
type Environment struct {
  Home string `env:"HOME"`
  Jenkins struct {
    BuildId     *string `env:"BUILD_ID"`
    BuildNumber int     `env:"BUILD_NUMBER"`
    Ci          bool    `env:"CI"`
  }
  Node struct {
    ConfigCache *string `env:"npm_config_cache,NPM_CONFIG_CACHE"`
  }
  Extras env.EnvSet
  Duration      time.Duration `env:"TYPE_DURATION"`
  DefaultValue  string        `env:"MISSING_VAR,default=default_value"`
  RequiredValue string        `env:"IM_REQUIRED,required=true"`
}
func main() {
  var environment Environment
  es, err := env.UnmarshalFromEnviron(&environment)
  if err != nil {
    log.Fatal(err)
  }
  // Remaining environment variables.
  environment.Extras = es
  // ...
  es, err = env.Marshal(environment)
  if err != nil {
    log.Fatal(err)
  }
  home := "/tmp/edgarl"
  cs := env.ChangeSet{
    "HOME":         &home,
    "BUILD_ID":     nil,
    "BUILD_NUMBER": nil,
  }
  es.Apply(cs)
  environment = Environment{}
  err = env.Unmarshal(es, &environment)
  if err != nil {
    log.Fatal(err)
  }
  environment.Extras = es
}

drone/envsubst

drone 团队出的,很不错

sethvargo/go-envconfig

同时也是基于tag的env 处理

  • 参考代码
type MyConfig struct {
  Port     int    `env:"PORT"`
  Username string `env:"USERNAME"`
}
export PORT=5555
export USERNAME=yoyo
package main
import (
  "context"
  "log"
  "github.com/sethvargo/go-envconfig"
)
func main() {
  ctx := context.Background()
  var c MyConfig
  if err := envconfig.Process(ctx, &c); err != nil {
    log.Fatal(err)
  }
  // c.Port = 5555
  // c.Username = "yoyo"
}

joeshaw/envdecode

同样也是基于tag 的env 处理

  • 参考代码
type Config struct {
    Hostname  string `env:"SERVER_HOSTNAME,default=localhost"`
    Port      uint16 `env:"SERVER_PORT,default=8080"`
    AWS struct {
        ID        string   `env:"AWS_ACCESS_KEY_ID"`
        Secret    string   `env:"AWS_SECRET_ACCESS_KEY,required"`
        SnsTopics []string `env:"AWS_SNS_TOPICS"`
    }
    Timeout time.Duration `env:"TIMEOUT,default=1m,strict"`
}

gobuffalo/envy

包含了更多的env set 以及加载文件处理,有好多新特性

参考资料

https://github.com/joho/godotenv
https://github.com/a8m/envsubst
https://github.com/Netflix/go-env
https://github.com/drone/envsubst
https://godoc.org/github.com/drone/envsubst
https://github.com/sethvargo/go-envconfig
https://github.com/joeshaw/envdecode
https://github.com/gobuffalo/envy

posted on   荣锋亮  阅读(595)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2019-10-17 Aquameta 基于postgresql的web 开发平台
2019-10-17 使用google autoservice 自动生成java spi 描述文件
2019-10-17 micronaut 学习 二 创建一个简单的服务
2019-10-17 micronaut 学习一 基本安装
2019-10-17 roughViz 一个可重用,功能强大的手绘图表组件
2018-10-17 使用just-api 进行接口测试
2016-10-17 HTTP Proxy Servlet 代理服务使用

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示