godotenv, ежедневная библиотека для Go

Go

Введение

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Исходный код также относительно легко читается, если у вас есть время, рекомендуем посмотреть интересующуюся детскую обувь~

Ссылаться на

  1. репозиторий godotenv на GitHub:GitHub.com/ просто ок ок/иди обожай…

я

мой блог

Добро пожаловать, чтобы обратить внимание на мою общедоступную учетную запись WeChat [GoUpUp], учитесь вместе и добивайтесь прогресса вместе ~

Эта статья опубликована в блогеOpenWriteвыпуск!