Введение
twelve-factorПриложения поддерживают сохранение конфигурации в переменных среды. Все, что нужно изменить при переходе от разработки к производству, извлекается из кода в переменные окружения.
Однако в реальной разработке, если на одном компьютере выполняется несколько проектов, установка переменных среды может легко конфликтовать, что нецелесообразно.godotenvбиблиотека из.envчтение конфигурации из файла,
Затем он сохраняется в переменных среды программы. Очень удобно иметь доступ к чтению в коде.godotenvСоздан из проекта с открытым исходным кодом Ruby.dotenv.
быстрый в использовании
Сначала необходимо установить сторонние библиотеки:
$ go get github.com/joho/godotenv
После использования:
package main
import (
"fmt"
"log"
"os"
"github.com/joho/godotenv"
)
func main() {
err := godotenv.Load()
if err != nil {
log.Fatal(err)
}
fmt.Println("name: ", os.Getenv("name"))
fmt.Println("age: ", os.Getenv("age"))
}
Затем в том же каталоге, что и исполняемая программа, добавьте.envдокумент:
name = dj
age = 18
Запускаем программу, выводим:
name: dj
age: 18
可见,使用非常方便。 по умолчанию,godotenvЧтение корневого каталога проекта.envфайл, используемый в файлеkey = valueформат, по одной паре ключ-значение в строке.
перечислитьgodotenv.Load()может быть загружен и может быть вызван напрямуюos.Getenv("key")читать.os.Getenvиспользуется для чтения переменных окружения:
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println(os.Getenv("GOPATH"))
}
Расширенные возможности
Автоматически загрузка
Если у вас есть добрая традиция программистов - ленивые, вы можете дажеLoadметоды не хотят вызывать себя. Ничего страшного,godotenvДай тебе ленивую силу!
Импортироватьgithub.com/joho/godotenv/autoload, конфигурация считывается автоматически:
package main
import (
"fmt"
"os"
_ "github.com/joho/godotenv/autoload"
)
func main() {
fmt.Println("name: ", os.Getenv("name"))
fmt.Println("age: ", os.Getenv("age"))
}
Обратите внимание, что, поскольку в коде нет явного использованияgodotenvБиблиотека, нужно импортировать пустую, то есть добавить импорт назад, когда имя пакета_.
СмотретьautoloadИсходный код пакета на самом деле является библиотекой, которая вызывает его для вас.Loadметод:
// src/github.com/joho/godotenv/autoload/autoload.go
package autoload
/*
You can just read the .env file on import just by doing
import _ "github.com/joho/godotenv/autoload"
And bob's your mother's brother
*/
import "github.com/joho/godotenv"
func init() {
godotenv.Load()
}
Внимательно смотрите комментарии, безвкусица у программиста 😂!
Загрузить пользовательский файл
По умолчанию он загружается из корневого каталога проекта..envдокумент.当然我们可以加载任意名称的文件,文件也不必以.envдля суффикса:
package main
import (
"fmt"
"log"
"os"
"github.com/joho/godotenv"
)
func main() {
err := godotenv.Load("common", "dev.env")
if err != nil {
log.Fatal(err)
}
fmt.Println("name: ", os.Getenv("name"))
fmt.Println("version: ", os.Getenv("version"))
fmt.Println("database: ", os.Getenv("database"))
}
commonсодержание документа:
name = awesome web
version = 0.0.1
dev.env:
database = sqlite
production.env:
database = mysql
Запустите его сами и посмотрите на результаты!
Уведомление:LoadПолучить несколько имен файлов в качестве параметров, если имя файла не передано, по умолчанию используется чтение.envСодержимое файла.
Если один и тот же ключ присутствует в нескольких файлах, то появляется приоритет, пост-вхождение не действует. Итак, приведенный выше выводdatabaseчто это?
Примечания
.envКомментарии могут быть добавлены к файлу, и комментарии начинаются с#начать до конца строки.
# app name
name = awesome web
# current version
version = 0.0.1
YAML
.envФайлы также могут быть в формате YAML:
name: awesome web
version: 0.0.1
package main
import (
"fmt"
"os"
_ "github.com/joho/godotenv/autoload"
)
func main() {
fmt.Println("name: ", os.Getenv("name"))
fmt.Println("version: ", os.Getenv("version"))
}
Не сохранять переменные среды
godotenvРазрешить не.envСодержимое файла хранится в переменной окружения, используяgodotenv.Read()вернутьmap[string]string, который можно использовать напрямую:
package main
import (
"fmt"
"log"
"github.com/joho/godotenv"
)
func main() {
var myEnv map[string]string
myEnv, err := godotenv.Read()
if err != nil {
log.Fatal(err)
}
fmt.Println("name: ", myEnv["name"])
fmt.Println("version: ", myEnv["version"])
}
Прямое управлениеmap, просто и понятно!
источник данных
Помимо чтения файлов, вы также можете читать файлы изio.Reader,отstringПрочитать конфигурацию в:
package main
import (
"fmt"
"log"
"github.com/joho/godotenv"
)
func main() {
content := `
name: awesome web
version: 0.0.1
`
myEnv, err := godotenv.Unmarshal(content)
if err != nil {
log.Fatal(err)
}
fmt.Println("name: ", myEnv["name"])
fmt.Println("version: ", myEnv["version"])
}
пока это реализуетсяio.ReaderИнтерфейс можно использовать как источник данных. можно скачать из файла (os.File),Интернет(net.Conn),bytes.Bufferчитать из разных источников:
package main
import (
"bytes"
"fmt"
"log"
"os"
"github.com/joho/godotenv"
)
func main() {
file, _ := os.OpenFile(".env", os.O_RDONLY, 0666)
myEnv, err := godotenv.Parse(file)
if err != nil {
log.Fatal(err)
}
fmt.Println("name: ", myEnv["name"])
fmt.Println("version: ", myEnv["version"])
buf := &bytes.Buffer{}
buf.WriteString("name: awesome web @buffer")
buf.Write([]byte{'\n'})
buf.WriteString("version: 0.0.1")
myEnv, err = godotenv.Parse(buf)
if err != nil {
log.Fatal(err)
}
fmt.Println("name: ", myEnv["name"])
fmt.Println("version: ", myEnv["version"])
}
Обратите внимание, что чтение из строки и изio.ReaderМетод, используемый для чтения, отличается. ПервыйUnmarshal, последнийParse.
генерировать.envдокумент
может быть процедурно сгенерирован.envСодержимое файла может быть записано непосредственно в файл:
package main
import (
"bytes"
"log"
"github.com/joho/godotenv"
)
func main() {
buf := &bytes.Buffer{}
buf.WriteString("name = awesome web")
buf.WriteByte('\n')
buf.WriteString("version = 0.0.1")
env, err := godotenv.Parse(buf)
if err != nil {
log.Fatal(err)
}
err = godotenv.Write(env, "./.env")
if err != nil {
log.Fatal(err)
}
}
Просмотр создан.envдокумент:
name="awesome web"
version="0.0.1"
Вы также можете вернуть строку, как месить, как вам нравится:
package main
import (
"bytes"
"fmt"
"log"
"github.com/joho/godotenv"
)
func main() {
buf := &bytes.Buffer{}
buf.WriteString("name = awesome web")
buf.WriteByte('\n')
buf.WriteString("version = 0.0.1")
env, err := godotenv.Parse(buf)
if err != nil {
log.Fatal(err)
}
content, err := godotenv.Marshal(env)
if err != nil {
log.Fatal(err)
}
fmt.Println(content)
}
режим командной строки
godotenvТакже предусмотрен режим командной строки:
$ godotenv -f ./.env command args
спередиgo getУстановитьgodotenvчас,godotenvуже установлен в$GOPATH/binкаталог, я ставил$GOPATH/binПрисоединяйтесь к системеPATH,такgodotenvКоманды можно использовать напрямую.
Режим командной строки - чтение указанного файла (если не передано-fуказано, использовать.envФайл), установите переменную среды, затем запустите программу.
Давайте просто напишем программу для проверки:
package main
import (
"fmt"
"os"
)
func main() {
fmt.Println(os.Getenv("name"))
fmt.Println(os.Getenv("version"))
}
использоватьgodotenvЗапустить его:
$ godotenv -f ./.env go run main.go
вывод:
awesome web
0.0.1
несколько сред
На практике, как правило, основывается наAPP_ENVЗначение переменной среды загружает разные файлы:
package main
import (
"fmt"
"log"
"os"
"github.com/joho/godotenv"
)
func main() {
env := os.Getenv("GODAILYLIB_ENV")
if env == "" {
env = "development"
}
err := godotenv.Load(".env." + env)
if err != nil {
log.Fatal(err)
}
err = godotenv.Load()
if err != nil {
log.Fatal(err)
}
fmt.Println("name: ", os.Getenv("name"))
fmt.Println("version: ", os.Getenv("version"))
fmt.Println("database: ", os.Getenv("database"))
}
Сначала читаем переменные окруженияGODAILYLIB_ENV, а затем прочитайте соответствующий.env.+ env, наконец, прочитайте дефолт.envдокумент.
Как упоминалось ранее, первое чтение имеет приоритет. Мы можем использовать значение по умолчанию.envОсновная информация и некоторые значения по умолчанию настраиваются в файле,
Если его необходимо модифицировать в среде разработки/тестирования/производства, то в соответствующем.env.development/.env.test/.env.productionВы можете настроить его снова в файле.
.envсодержание документа:
name = awesome web
version = 0.0.1
database = file
.env.development:
database = sqlite3
.env.production:
database = mysql
Запустите программу:
# 默认是开发环境
$ go run main.go
name: awesome web
version: 0.0.1
database: sqlite3
# 设置为生成环境
$ GODAILYLIB_ENV=production go run main.go
name: awesome web
version: 0.0.1
database: mysql
немного исходного кода
godotenvПрочтите содержимое файла, для чего его можно использоватьos.Getenvдоступ:
// src/github.com/joho/godotenv/godotenv.go
func loadFile(filename string, overload bool) error {
envMap, err := readFile(filename)
if err != nil {
return err
}
currentEnv := map[string]bool{}
rawEnv := os.Environ()
for _, rawEnvLine := range rawEnv {
key := strings.Split(rawEnvLine, "=")[0]
currentEnv[key] = true
}
for key, value := range envMap {
if !currentEnv[key] || overload {
os.Setenv(key, value)
}
}
return nil
}
так какgodotenvперечислитьos.SetenvУстановите пару ключ-значение в переменную среды.
Суммировать
В этой статье описываетсяgodotenvБазовое и расширенное использование библиотеки.godotenvИсходный код также относительно легко читается, если у вас есть время, рекомендуем посмотреть интересующуюся детскую обувь~
Ссылаться на
- репозиторий godotenv на GitHub:GitHub.com/ просто ок ок/иди обожай…
я
Добро пожаловать, чтобы обратить внимание на мою общедоступную учетную запись WeChat [GoUpUp], учитесь вместе и добивайтесь прогресса вместе ~
Эта статья опубликована в блогеOpenWriteвыпуск!