joho/godotenv

GitHub: joho/godotenv

一个 Go 语言的 dotenv 库,用于从 `.env` 文件加载环境变量,让应用配置与代码解耦。

Stars: 10542 | Forks: 455

# GoDotEnv ![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg) [![Go Report Card](https://goreportcard.com/badge/github.com/joho/godotenv)](https://goreportcard.com/report/github.com/joho/godotenv) 源自原始库: 它可以作为库使用(为你自己的 daemon 等加载 env),也可以作为 bin 命令使用。 目前有针对 linuxish 和 Windows 环境的测试覆盖和 CI,但我对 bin 版本在 Windows 上能正常工作不作任何保证。 ## 安装说明 作为库 ``` go get github.com/joho/godotenv ``` 作为工具依赖: go >= 1.24 ``` go get -tool github.com/joho/godotenv/cmd/godotenv ``` 或者如果你想将其作为 bin 命令使用 ``` go install github.com/joho/godotenv/cmd/godotenv@latest ``` ## 用法 将你的应用配置添加到项目根目录下的 `.env` 文件中: ``` S3_BUCKET=YOURS3BUCKET SECRET_KEY=YOURSECRETKEYGOESHERE ``` 然后在你的 Go 应用中,你可以这样做 ``` package main import ( "log" "os" "github.com/joho/godotenv" ) 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 } ``` 如果你比这还要懒,你可以直接利用 autoload 包,它会在导入时读取 `.env` ``` import _ "github.com/joho/godotenv/autoload" ``` 虽然项目根目录下的 `.env` 是默认选项,但你不必受此限制,以下两个示例都是 100% 合法的 ``` godotenv.Load("somerandomfile") godotenv.Load("filenumberone.env", "filenumbertwo.env") ``` 如果你想花哨地处理你的 env 文件,你可以添加注释和 exports(下面是一个合法的 env 文件) ``` # 我是一个注释,这没问题 SOME_VAR=someval FOO=BAR # comments at line end are OK too export BAR=BAZ ``` 最后,你还可以使用 YAML(ish) 风格 ``` FOO: bar BAR: baz ``` 最后再补充一点,如果你不想让 godotenv 修改你的 env,你可以直接让它返回一个 map ``` var myEnv map[string]string myEnv, err = godotenv.Read() s3Bucket := myEnv["S3_BUCKET"] ``` ... 或者从 `io.Reader` 读取,而不是从本地文件 ``` reader := getRemoteFile() myEnv, err := godotenv.Parse(reader) ``` ... 如果你愿意,也可以从 `string` 读取 ``` content := getRemoteFileContent() myEnv, err := godotenv.Unmarshal(content) ``` ### 变量名兼容性 Ruby 的 dotenv 仅允许 key 名称中包含 `[A-Za-z0-9_.]`,而 Node 的 dotenv 还允许包含 `-`。godotenv 从 v1.4.0 版本起已与 Node 的字符集保持一致,因此像 `MY-VAR` 这样的 key 在这里和 Node 中都能正常解析,但在 Ruby 的 dotenv 下会报错。 ### 优先级与约定 现有的 env 优先于稍后加载的 env。 管理多个环境(即开发、测试、生产)的[约定](https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use) 是创建一个名为 `{YOURAPP}_ENV` 的 env,并按以下顺序加载 env: ``` env := os.Getenv("FOO_ENV") if "" == env { env = "development" } godotenv.Load() // The Original .env godotenv.Load(".env." + env) if "test" != env { godotenv.Load(".env.local") } godotenv.Load(".env." + env + ".local") ``` 如果有需要,你还可以使用 `godotenv.Overload()` 来打破这一约定 覆盖现有的 env,而不是仅仅替换它们。请谨慎使用。 ### 命令模式 假设你已经按照上述说明安装了命令,并且你的 `$PATH` 中包含了 `$GOPATH/bin` ``` godotenv -f /some/path/to/.env some_command with some args ``` 如果你不指定 `-f`,它将默认加载 `PWD` 中的 `.env` 默认情况下,它不会覆盖现有的环境变量;你可以使用 `-o` 标志来实现这一点。 ### 写入 Env 文件 Godotenv 还可以将表示环境的 map 写入一个格式正确且经过转义的文件中 ``` env, err := godotenv.Unmarshal("KEY=value") err := godotenv.Write(env, "./.env") ``` ... 或者写入一个字符串 ``` env, err := godotenv.Unmarshal("KEY=value") content, err := godotenv.Marshal(env) ``` ## 发布 所有版本发布均使用[带注释的标签 (annotated tags)](https://github.com/joho/godotenv/issues/30)。示例:`git tag -a v1.2.1` ## 作者? 原始库 [dotenv](https://github.com/bkeepers/dotenv) 由 [Brandon Keepers](http://opensoul.org/) 编写,本移植版本由 [John Barton](https://johnbarton.co/) 基于原始库中的测试/夹具 (fixtures) 完成。
标签:EVTX分析, Go, Ruby工具, SOC Prime, 开发工具, 日志审计, 环境变量