golang从.env文件加载环境变量插件库godotenv的使用
Golang从.env文件加载环境变量插件库godotenv的使用
概述
godotenv是一个Go语言实现的Ruby dotenv项目的移植版本,它可以从.env文件中加载环境变量到ENV中。
安装
作为库使用
go get github.com/joho/godotenv
作为命令行工具使用
对于Go >= 1.17:
go install github.com/joho/godotenv/cmd/godotenv@latest
对于Go < 1.17:
go get github.com/joho/godotenv/cmd/godotenv
使用示例
基本用法
- 首先在项目根目录创建.env文件:
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
- 然后在Go程序中加载.env文件:
package main
import (
"log"
"os"
"github.com/joho/godotenv"
)
func main() {
// 加载.env文件
err := godotenv.Load()
if err != nil {
log.Fatal("Error loading .env file")
}
// 获取环境变量
s3Bucket := os.Getenv("S3_BUCKET")
secretKey := os.Getenv("SECRET_KEY")
// 使用环境变量...
}
自动加载
如果你不想手动调用Load(),可以使用autoload包,它会在导入时自动加载.env文件:
import _ "github.com/joho/godotenv/autoload"
加载多个文件
你可以加载任意数量的.env文件:
godotenv.Load("somerandomfile")
godotenv.Load("filenumberone.env", "filenumbertwo.env")
高级.env文件格式
.env文件支持注释和export语法:
# 我是注释,这是允许的
SOME_VAR=someval
FOO=BAR # 行尾注释也是允许的
export BAR=BAZ
也支持YAML风格的格式:
FOO: bar
BAR: baz
获取环境变量映射
如果你不想让godotenv修改环境变量,可以直接获取映射:
var myEnv map[string]string
myEnv, err := godotenv.Read()
s3Bucket := myEnv["S3_BUCKET"]
从io.Reader读取
可以从io.Reader而不是本地文件读取:
reader := getRemoteFile()
myEnv, err := godotenv.Parse(reader)
从字符串解析
也可以直接从字符串解析:
content := getRemoteFileContent()
myEnv, err := godotenv.Unmarshal(content)
环境优先级和约定
已存在的环境变量优先于后来加载的环境变量。
管理多个环境(如开发、测试、生产)的约定是创建一个名为{YOURAPP}_ENV的环境变量,并按以下顺序加载环境:
env := os.Getenv("FOO_ENV")
if "" == env {
env = "development"
}
godotenv.Load(".env." + env + ".local")
if "test" != env {
godotenv.Load(".env.local")
}
godotenv.Load(".env." + env)
godotenv.Load() // 原始的.env
如果需要,你也可以使用godotenv.Overload()来覆盖现有环境变量(谨慎使用)。
命令行模式
假设你已经安装了命令行工具并且$GOPATH/bin在你的$PATH中:
godotenv -f /some/path/to/.env some_command with some args
如果不指定-f,它将默认加载PWD中的.env文件。
默认情况下,它不会覆盖现有的环境变量;你可以使用-o标志来实现这一点。
写入.env文件
godotenv也可以将表示环境的映射写入正确格式化和转义的文件:
env, err := godotenv.Unmarshal("KEY=value")
err := godotenv.Write(env, "./.env")
或者写入字符串:
env, err := godotenv.Unmarshal("KEY=value")
content, err := godotenv.Marshal(env)
贡献
欢迎贡献,但有一些注意事项。这个库已被声明为功能完整,不会接受添加新功能或破坏库API的问题或拉取请求。
更多关于golang从.env文件加载环境变量插件库godotenv的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang从.env文件加载环境变量插件库godotenv的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用 godotenv 在 Golang 中加载 .env 文件
godotenv 是一个流行的 Golang 库,用于从 .env 文件加载环境变量到应用程序中。它模仿了 Ruby 的 dotenv 库的功能,非常适合在开发环境中管理配置。
安装 godotenv
首先,使用 go get 安装 godotenv:
go get github.com/joho/godotenv
基本用法
1. 最简单的加载方式
package main
import (
"fmt"
"log"
"os"
"github.com/joho/godotenv"
)
func main() {
// 加载 .env 文件
err := godotenv.Load()
if err != nil {
log.Fatal("Error loading .env file")
}
// 获取环境变量
dbUser := os.Getenv("DB_USER")
dbPass := os.Getenv("DB_PASS")
fmt.Printf("DB User: %s, DB Pass: %s\n", dbUser, dbPass)
}
2. 指定自定义 .env 文件路径
err := godotenv.Load("custom.env")
if err != nil {
log.Fatal("Error loading custom.env file")
}
3. 加载多个 .env 文件
err := godotenv.Load(".env", ".env.local")
if err != nil {
log.Fatal("Error loading .env files")
}
高级用法
1. 预加载环境变量(不覆盖已存在的变量)
godotenv.Overload() // 会覆盖已存在的变量
godotenv.Load() // 不会覆盖已存在的变量
2. 读取 .env 文件内容但不设置到环境变量
envMap, err := godotenv.Read()
if err != nil {
log.Fatal("Error reading .env file")
}
fmt.Println(envMap["DB_HOST"]) // 直接访问解析后的map
3. 将字符串解析为环境变量映射
envString := `DB_HOST=localhost
DB_PORT=5432`
envMap, err := godotenv.Unmarshal(envString)
if err != nil {
log.Fatal("Error parsing env string")
}
fmt.Println(envMap["DB_PORT"])
4. 将环境变量映射写入文件
envMap := map[string]string{
"DB_HOST": "localhost",
"DB_PORT": "5432",
}
err := godotenv.Write(envMap, "./.env.new")
if err != nil {
log.Fatal("Error writing .env file")
}
实际应用示例
package main
import (
"fmt"
"log"
"os"
"github.com/joho/godotenv"
)
type Config struct {
DBHost string
DBPort string
DBUser string
DBPassword string
DebugMode bool
}
func LoadConfig() (*Config, error) {
// 尝试加载.env文件,如果不存在也不报错
_ = godotenv.Load(".env.local") // 本地覆盖配置
_ = godotenv.Load() // 默认.env文件
config := &Config{
DBHost: getEnv("DB_HOST", "localhost"),
DBPort: getEnv("DB_PORT", "5432"),
DBUser: getEnv("DB_USER", ""),
DBPassword: getEnv("DB_PASSWORD", ""),
DebugMode: getEnv("DEBUG", "false") == "true",
}
if config.DBUser == "" || config.DBPassword == "" {
return nil, fmt.Errorf("database credentials not set")
}
return config, nil
}
func getEnv(key, defaultValue string) string {
value := os.Getenv(key)
if value == "" {
return defaultValue
}
return value
}
func main() {
config, err := LoadConfig()
if err != nil {
log.Fatalf("Failed to load config: %v", err)
}
fmt.Printf("Database Config:\nHost: %s\nPort: %s\nUser: %s\nDebug Mode: %v\n",
config.DBHost, config.DBPort, config.DBUser, config.DebugMode)
}
最佳实践
- 不要将 .env 文件提交到版本控制 - 确保将 .env 添加到 .gitignore
- 提供示例文件 - 可以提交一个 .env.example 文件,包含所有需要的键但不包含敏感值
- 分层配置 - 可以有一个基础 .env 文件和本地开发用的 .env.local 文件
- 生产环境不使用 .env - 生产环境应该直接设置环境变量,而不是依赖 .env 文件
godotenv 是一个简单但功能强大的工具,可以大大简化开发环境中的配置管理。