Введение
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выпуск!