vendor/github.com/subosito/gotenv/README.md
changeset 251 1c52a0eeb952
child 260 445e01aede7e
equal deleted inserted replaced
250:c040f992052f 251:1c52a0eeb952
       
     1 # gotenv
       
     2 
       
     3 [![Build Status](https://travis-ci.org/subosito/gotenv.svg?branch=master)](https://travis-ci.org/subosito/gotenv)
       
     4 [![Build status](https://ci.appveyor.com/api/projects/status/wb2e075xkfl0m0v2/branch/master?svg=true)](https://ci.appveyor.com/project/subosito/gotenv/branch/master)
       
     5 [![Coverage Status](https://badgen.net/codecov/c/github/subosito/gotenv)](https://codecov.io/gh/subosito/gotenv)
       
     6 [![Go Report Card](https://goreportcard.com/badge/github.com/subosito/gotenv)](https://goreportcard.com/report/github.com/subosito/gotenv)
       
     7 [![GoDoc](https://godoc.org/github.com/subosito/gotenv?status.svg)](https://godoc.org/github.com/subosito/gotenv)
       
     8 
       
     9 Load environment variables dynamically in Go.
       
    10 
       
    11 ## Usage
       
    12 
       
    13 Put the gotenv package on your `import` statement:
       
    14 
       
    15 ```go
       
    16 import "github.com/subosito/gotenv"
       
    17 ```
       
    18 
       
    19 To modify your app environment variables, `gotenv` expose 2 main functions:
       
    20 
       
    21 - `gotenv.Load`
       
    22 - `gotenv.Apply`
       
    23 
       
    24 By default, `gotenv.Load` will look for a file called `.env` in the current working directory.
       
    25 
       
    26 Behind the scene, it will then load `.env` file and export the valid variables to the environment variables. Make sure you call the method as soon as possible to ensure it loads all variables, say, put it on `init()` function.
       
    27 
       
    28 Once loaded you can use `os.Getenv()` to get the value of the variable.
       
    29 
       
    30 Let's say you have `.env` file:
       
    31 
       
    32 ```
       
    33 APP_ID=1234567
       
    34 APP_SECRET=abcdef
       
    35 ```
       
    36 
       
    37 Here's the example of your app:
       
    38 
       
    39 ```go
       
    40 package main
       
    41 
       
    42 import (
       
    43 	"github.com/subosito/gotenv"
       
    44 	"log"
       
    45 	"os"
       
    46 )
       
    47 
       
    48 func init() {
       
    49 	gotenv.Load()
       
    50 }
       
    51 
       
    52 func main() {
       
    53 	log.Println(os.Getenv("APP_ID"))     // "1234567"
       
    54 	log.Println(os.Getenv("APP_SECRET")) // "abcdef"
       
    55 }
       
    56 ```
       
    57 
       
    58 You can also load other than `.env` file if you wish. Just supply filenames when calling `Load()`. It will load them in order and the first value set for a variable will win.:
       
    59 
       
    60 ```go
       
    61 gotenv.Load(".env.production", "credentials")
       
    62 ```
       
    63 
       
    64 While `gotenv.Load` loads entries from `.env` file, `gotenv.Apply` allows you to use any `io.Reader`:
       
    65 
       
    66 ```go
       
    67 gotenv.Apply(strings.NewReader("APP_ID=1234567"))
       
    68 
       
    69 log.Println(os.Getenv("APP_ID"))
       
    70 // Output: "1234567"
       
    71 ```
       
    72 
       
    73 Both `gotenv.Load` and `gotenv.Apply` **DO NOT** overrides existing environment variables. If you want to override existing ones, you can see section below.
       
    74 
       
    75 ### Environment Overrides
       
    76 
       
    77 Besides above functions, `gotenv` also provides another functions that overrides existing:
       
    78 
       
    79 - `gotenv.OverLoad`
       
    80 - `gotenv.OverApply`
       
    81 
       
    82 
       
    83 Here's the example of this overrides behavior:
       
    84 
       
    85 ```go
       
    86 os.Setenv("HELLO", "world")
       
    87 
       
    88 // NOTE: using Apply existing value will be reserved
       
    89 gotenv.Apply(strings.NewReader("HELLO=universe"))
       
    90 fmt.Println(os.Getenv("HELLO"))
       
    91 // Output: "world"
       
    92 
       
    93 // NOTE: using OverApply existing value will be overridden
       
    94 gotenv.OverApply(strings.NewReader("HELLO=universe"))
       
    95 fmt.Println(os.Getenv("HELLO"))
       
    96 // Output: "universe"
       
    97 ```
       
    98 
       
    99 ### Throw a Panic
       
   100 
       
   101 Both `gotenv.Load` and `gotenv.OverLoad` returns an error on something wrong occurred, like your env file is not exist, and so on. To make it easier to use, `gotenv` also provides `gotenv.Must` helper, to let it panic when an error returned.
       
   102 
       
   103 ```go
       
   104 err := gotenv.Load(".env-is-not-exist")
       
   105 fmt.Println("error", err)
       
   106 // error: open .env-is-not-exist: no such file or directory
       
   107 
       
   108 gotenv.Must(gotenv.Load, ".env-is-not-exist")
       
   109 // it will throw a panic
       
   110 // panic: open .env-is-not-exist: no such file or directory
       
   111 ```
       
   112 
       
   113 ### Another Scenario
       
   114 
       
   115 Just in case you want to parse environment variables from any `io.Reader`, gotenv keeps its `Parse` and `StrictParse` function as public API so you can use that.
       
   116 
       
   117 ```go
       
   118 // import "strings"
       
   119 
       
   120 pairs := gotenv.Parse(strings.NewReader("FOO=test\nBAR=$FOO"))
       
   121 // gotenv.Env{"FOO": "test", "BAR": "test"}
       
   122 
       
   123 err, pairs = gotenv.StrictParse(strings.NewReader(`FOO="bar"`))
       
   124 // gotenv.Env{"FOO": "bar"}
       
   125 ```
       
   126 
       
   127 `Parse` ignores invalid lines and returns `Env` of valid environment variables, while `StrictParse` returns an error for invalid lines.
       
   128 
       
   129 ## Notes
       
   130 
       
   131 The gotenv package is a Go port of [`dotenv`](https://github.com/bkeepers/dotenv) project with some additions made for Go. For general features, it aims to be compatible as close as possible.