• Stars
    star
    7,974
  • Rank 4,695 (Top 0.1 %)
  • Language
    Go
  • License
    MIT License
  • Created over 11 years ago
  • Updated 6 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A Go port of Ruby's dotenv library (Loads environment variables from .env files)

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

or if you want to use it as a bin command

go >= 1.17

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

go < 1.17

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

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)

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(".env." + env + ".local")
if "test" != env {
  godotenv.Load(".env.local")
}
godotenv.Load(".env." + env)
godotenv.Load() // The Original .env

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:

  • bring this library's parsing into closer compatibility with the mainline dotenv implementations, in particular Ruby's dotenv and Node.js' dotenv
  • keep the library up to date with the go ecosystem (ie CI bumps, documentation changes, changes in the core libraries)
  • bug fixes for use cases that pertain to the library's purpose of easing development of codebases deployed into twelve factor environments

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.

More Repositories

1

7XX-rfc

An RFC for a new series of HTTP status codes covering developer fouls.
Makefile
4,477
star
2

awesome-code-review

An "Awesome" list of code review resources - articles, papers, tools, etc
4,299
star
3

sqltocsv

Go package to turn arbitrary database/sql query results into CSV files as easily as possible
Go
186
star
4

pico8-vscode

A vscode extension for working with pico-8 cartridges.
TypeScript
36
star
5

dotfiles

Stuff for my terminal
Vim Script
30
star
6

aws-pony

For people who like ponies or poor AWS key hygiene. I think those are the same things.
JavaScript
23
star
7

geonames-rails

a lightweight plugin to map to imported geonames data with a repeatable import
Ruby
18
star
8

lazy-loader

Keeps controllers clean in the face of ugly fragment caching using a lazy load
Ruby
13
star
9

lighthouse-cards

A small sinatra app to generate printable index cards (for agile processes) from lighthouse tickets - now with added dashboard!
JavaScript
9
star
10

absurd-time-extensions

Added some stupid extensions to the time class, such as the swatch "internet time", and the is_beer_oclock? method
Ruby
8
star
11

letour

Watch tour de france highlights without spoilers at http://letour.whoisjohnbarton.com
Go
8
star
12

spacetanks

Railscamp weekend project - fight dracula in space with your tank on the Arduboy
C
6
star
13

mapmaker

A handy DSL for generating google sitemaps
Ruby
5
star
14

blog

My Blog + Homepage
Ruby
5
star
15

sphinx-stemmer-ruby-port

Trying to figure out how much work it is to build our own search engine... by discovering how our current one works.
C
5
star
16

programmers_oblique_strategies

Get some extra nuggets in your fortune cookies
Makefile
5
star
17

shoutcloud_api

ALL CAPS AS A SERVICE. THE CLOUD THAT SHOUTS BACK.
Go
4
star
18

rspec_xml_validation_matchers

Xml validation rspec matcher
Ruby
3
star
19

noobnightexamples

examples for live coding on the go noob night
Go
3
star
20

shoutcloud.io

CSS
3
star
21

alphakey

Handy little library for converting ints to short strings (for things like url shorteners and the like)
Go
3
star
22

seven-languages

repo to hold all my WIP as I work my way through the 7 Languages in 7 Weeks book
Scala
2
star
23

worldpurplerainhour

It's just like earth hour, but instead of turning off the lights, you crank purple rain
Ruby
2
star
24

experiments

scratchpad of random ideas i hack around with in go
Go
2
star
25

pico8

A monorepo for my whole PICO-8 workspace
2
star
26

goadventure

I'm trying to write a twitter based text adventure in go. It may or may not get finished.
Go
2
star
27

jrb

A placeholder repo for my future world dominating ruby framework.
Ruby
2
star
28

joho.github.com

my pages
2
star
29

php

My Personal Home Page, or PHP for short.
HTML
2
star
30

das_downloader

A downloader for destroy all software episodes written in go. A half finished hack at best.
Go
2
star
31

joho

Public README repo
1
star
32

wdyk

JavaScript
1
star
33

actually_js

Ruby
1
star
34

shoutcloud_pro_api

THE PRO VERSION OF THE SUPERIOR WEBSCALE ALL CAPS SOFTWARE AS A SERVICE
Go
1
star
35

gogogpm

A hilariously pointless go wrapper of gpm
Go
1
star
36

prohttphandler

A (not very) pro http handler for go (does simple asset serving and exact match paths -> handler funcs)
Go
1
star
37

test-comply

1
star
38

shirts

Ruby
1
star
39

twitter-bomb-disposal

Delete all your tweets that don't do numbers
TypeScript
1
star
40

snackjs-flickr-gallery

A Flickr image gallery built using SnackJS and CSS3 Transitions
JavaScript
1
star