joho/godotenv
GitHub: joho/godotenv
Stars: 10456 | Forks: 451
# GoDotEnv  [](https://goreportcard.com/report/github.com/joho/godotenv)
From the original Library:
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](https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use)
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)
## Releases
Use [annotated tags for all releases](https://github.com/joho/godotenv/issues/30). Example `git tag -a v1.2.1`
## Who?
The original library [dotenv](https://github.com/bkeepers/dotenv) was written by [Brandon Keepers](http://opensoul.org/), and this port was done by [John Barton](https://johnbarton.co/) based off the tests/fixtures in the original library.
标签:EVTX分析