joho/godotenv
GitHub: joho/godotenv
一个 Go 语言的 dotenv 库,用于从 `.env` 文件加载环境变量,让应用配置与代码解耦。
Stars: 10542 | Forks: 455
# 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, 开发工具, 日志审计, 环境变量