godotenv README

The project's README from github.com/joho/godotenv. As one markdown file: README.md.

GoDotEnv CI Go Report Card

A Go (golang) port of the Ruby dotenv project (which loads env vars from a .env file).

From the original Library:

Storing configuration in the environment is one of the tenets of a twelve-factor app. Anything that is likely to change between deployment environments–such as resource handles for databases or credentials for external services–should be extracted from the code into environment variables.

But it is not always practical to set environment variables on development machines or continuous integration servers where multiple projects are run. Dotenv load variables from a .env file into ENV when the environment is bootstrapped.

It can be used as a library (for loading in env for your own daemons etc.) or as a bin command.

There is test coverage and CI for both linuxish and Windows environments, but I make no guarantees about the bin version working on Windows.

Installation

As a library

go get github.com/joho/godotenv

as a tool dependency:

go >= 1.24

go get -tool github.com/joho/godotenv/cmd/godotenv

or if you want to use it as a bin command

go install github.com/joho/godotenv/cmd/godotenv@latest

Usage

Add your application configuration to your .env file in the root of your project:

S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE

Then in your Go app you can do something like

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
}

If you're even lazier than that, you can just take advantage of the autoload package which will read in .env on import

import _ "github.com/joho/godotenv/autoload"

While .env in the project root is the default, you don't have to be constrained, both examples below are 100% legit

godotenv.Load("somerandomfile")
godotenv.Load("filenumberone.env", "filenumbertwo.env")

If you want to be really fancy with your env file you can do comments and exports (below is a valid env file)

# I am a comment and that is OK
SOME_VAR=someval
FOO=BAR # comments at line end are OK too
export BAR=BAZ

Or finally you can do YAML(ish) style

FOO: bar
BAR: baz

as a final aside, if you don't want godotenv munging your env you can just get a map back instead

var myEnv map[string]string
myEnv, err = godotenv.Read()

s3Bucket := myEnv["S3_BUCKET"]

... or from an io.Reader instead of a local file

reader := getRemoteFile()
myEnv, err := godotenv.Parse(reader)

... or from a string if you so desire

content := getRemoteFileContent()
myEnv, err := godotenv.Unmarshal(content)

Variable name compatibility

Ruby's dotenv only allows [A-Za-z0-9_.] in key names, while Node's dotenv also permits -. godotenv has matched the Node charset since v1.4.0, so keys like MY-VAR parse cleanly here and in Node but will error under Ruby's dotenv.

Precedence & Conventions

Existing envs take precedence of envs that are loaded later.

The convention for managing multiple environments (i.e. development, test, production) is to create an env named {YOURAPP}_ENV and load envs in this order:

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")

If you need to, you can also use godotenv.Overload() to defy this convention and overwrite existing envs instead of only supplanting them. Use with caution.

Command Mode

Assuming you've installed the command as above and you've got $GOPATH/bin in your $PATH

godotenv -f /some/path/to/.env some_command with some args

If you don't specify -f it will fall back on the default of loading .env in PWD

By default, it won't override existing environment variables; you can do that with the -o flag.

Writing Env Files

Godotenv can also write a map representing the environment to a correctly-formatted and escaped file

env, err := godotenv.Unmarshal("KEY=value")
err := godotenv.Write(env, "./.env")

... or to a string

env, err := godotenv.Unmarshal("KEY=value")
content, err := godotenv.Marshal(env)

Contributing

Contributions are welcome, but with some caveats.

This library has been declared feature complete (see #182 for background) and will not be accepting issues or pull requests adding new functionality or breaking the library API.

Contributions would be gladly accepted that:

code changes without tests and references to peer dotenv implementations will not be accepted

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Added some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

Releases

Releases should follow Semver though the first couple of releases are v1 and v1.1.

Use annotated tags for all releases. Example git tag -a v1.2.1

Who?

The original library dotenv was written by Brandon Keepers, and this port was done by John Barton based off the tests/fixtures in the original library.

godotenv (joho/godotenv)

Searching Database…

10.7K ·GitHub
这是什么东西?它是 Ruby 的 dotenv 的 Go 版移植:一个库加命令行工具,在应用启动时把 .env 文件里的环境变量加载进你的进程环境。
它是库还是命令行工具?两者都是。可以作为 Go 库导入,为你自己的后台服务和应用加载环境变量;也可以安装成一个 bin 命令,用它加载 .env 并运行你的程序。
在我的 Go 应用里怎么开始使用它?把它添加为工具依赖,把配置放在项目根目录的 .env 文件里,然后在你的 Go 应用中加载它——或者直接导入 autoload 包,.env 就会被自动读取。
需要特定版本的 Go 吗?只要求 Go 1.24 或更新版本;除此之外这个库没有任何外部依赖。
.env 里的值会覆盖我环境里已经设置好的变量吗?不会——已有的环境变量始终优先于加载的 .env 值。如果你确实想覆盖它们,可以调用 godotenv.Overload()(或在命令模式下传入 -o)。
命令行版本在 Windows 上能用吗?这个库本身在 Linux 系和 Windows 环境上都通过了 CI 测试,但作者明确表示不对 bin 命令在 Windows 上的表现做任何保证。
.env 文件里可以写什么?标准的 KEY=value 行都可以,另外注释、export 前缀,甚至类似 YAML 的写法也都算有效的 env 文件语法。
除了项目根目录的 .env,还能从别的地方加载环境变量吗?可以——你可以指定自定义路径,从 io.Reader 或字符串加载,也可以把所有内容拿回来作为一个 map,而不改动环境。
godotenv 也能写 .env 文件吗,还是只能读?它也能写:godotenv 可以把代表你环境变量的 map 序列化成格式正确、经过转义的 .env 文件,或者序列化成字符串。
这个项目还在积极开发吗?它已宣布功能开发完毕:可以接受 bug 修复、与主线 dotenv 实现更进一步兼容以及生态维护,但不再接受新功能或破坏 API 的改动。
What are similar projects?phpdotenv, dotenv, yq, gvm, caire, chezmoi, lazygit, mise
Creator
joho
Size
0.2 MB
Stars
10.7K
Age
13y
Commits · 90 Days