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

使用示例

基本用法

  1. 首先在项目根目录创建.env文件:
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
  1. 然后在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

1 回复

更多关于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)
}

最佳实践

  1. 不要将 .env 文件提交到版本控制 - 确保将 .env 添加到 .gitignore
  2. 提供示例文件 - 可以提交一个 .env.example 文件,包含所有需要的键但不包含敏感值
  3. 分层配置 - 可以有一个基础 .env 文件和本地开发用的 .env.local 文件
  4. 生产环境不使用 .env - 生产环境应该直接设置环境变量,而不是依赖 .env 文件

godotenv 是一个简单但功能强大的工具,可以大大简化开发环境中的配置管理。

回到顶部