Цель
В этом посте вы узнаете, как использовать Viper . Он предназначен для людей, которые плохо знакомы с языком программирования Go (я только начинаю сам). Это потому, что цель не Viper сама по себе, а процесс выполнения некоторых основ в Go.
Предположения
- Вы установили Go. В моем случае: иди версия go1.3.3 darwin / amd64
Настройка
Прежде всего, нам нужно создать каталог для размещения нашей работы, т.е. нам нужно создать рабочее пространство:
Код Go должен храниться в рабочей области. Рабочая область — это иерархия каталогов с тремя каталогами в корне:
- ЦСИ
- упак
- бункер
$ mkdir useviper_workspace $ cd useviper_workspace useviper_workspace$ mkdir src bin pkg
Далее, давайте создадим каталог, в котором будет размещен наш исходный код для этого поста / вашего проекта. При этом удобно иметь в виду следующие рекомендации:
Пакеты из стандартной библиотеки имеют короткие пути, такие как «fmt» и «net / http». Для ваших собственных пакетов вы должны выбрать базовый путь, который вряд ли будет конфликтовать с будущими дополнениями к стандартной библиотеке или другим внешним библиотекам.
Если вы храните свой код в исходном хранилище, то вам следует использовать корень этого исходного хранилища в качестве базового пути. Например, если у вас есть учетная запись GitHub на github.com/user, это должен быть ваш базовый путь.
Обратите внимание, что вам не нужно публиковать свой код в удаленном хранилище, прежде чем вы сможете его построить. Это просто хорошая привычка организовывать ваш код так, как будто вы когда-нибудь опубликуете его. На практике вы можете выбрать любое произвольное имя пути, если оно уникально для стандартной библиотеки и большей экосистемы Go.
useviper_workspace$ mkdir -p src/github.com/justincalleja/useviper
Я пойду с github.com/justincalleja/useviper и оставлю это на данный момент, так как я не слишком знаком с go
инструментом, чтобы рассказать вам, почему и как. Вскоре мы увидим, что go
его можно использовать для извлечения стороннего исходного кода, который размещен в открытом доступе, и что структура каталогов играет в этом роль, т. Е. Если вы планируете отправить свой код в какое-либо общедоступное хранилище, вы захотите отразить это в структуре каталогов, ведущей к корню исходного кода вашего проекта (например, github.com/<you> / <имя-проекта> ).
Прежде чем продолжить, вы захотите установить переменную среды GOPATH :
Переменная среды GOPATH указывает местоположение вашего рабочего пространства.
Ваше рабочее пространство может быть расположено где угодно … Обратите внимание, что это не должен быть тот же путь, что и в вашей установке Go.
useviper_workspace$ echo $GOPATH /Users/justin/go-stuff/useviper_workspace useviper_workspace$ type set_gopath set_gopath is a function set_gopath () { export GOPATH=pwd; export PATH=$GOPATH/bin:$PATH }
Я уже установил свой GOPATH с помощью set_gopath
функции bash, которая показана выше. Вы можете поместить это в любой файл, полученный при запуске терминала (например, ~ / .bashrc, ~ / .profile и т. Д.).
Запуск некоторого кода
Наконец, мы можем приступить к написанию кода. Если вы хотите, инициализируйте git-репозиторий по адресу src / github.com / <user> / useviper и добавьте туда useviper.go :
package main import ( "fmt" "github.com/spf13/viper" ) func main() { fmt.Println("in main") viper.SetConfigName("config") // name of config file (without extension) }
Мы просто печатаем в стандартном виде и делаем базовое использование Viper согласно инструкциям по использованию (обратите внимание, что если вы не используете что-то, вы импортируете, компилятор пожалуется на это и не позволит вам собрать).
Теперь «fmt» встроен, но как насчет «github.com/spf13/viper»? Как мы получаем эту зависимость?
useviper_workspace$ go get can’t load package: package .: no buildable Go source files in /Users/justin/go-stuff/useviper_workspace
Если я пытаюсь запустить go get
из корня моего рабочего пространства, я получаю ошибку, показанную выше. Похоже, go get
что исходные файлы Go lang находятся в каталоге, в котором вы их запускаете. Попробуйте запустить его снова в каталоге useviper, где у нас есть файл useviper.go . На этот раз он висит некоторое время. Это потому, что go get
сканирует найденные исходные файлы и загружает их, создает и устанавливает наши зависимости и код в наше рабочее пространство. Если мы распечатаем структуру каталогов до 3-х уровней, мы получим:
useviper_workspace$ tree -L 3 . ├── bin │ └── useviper ├── pkg │ └── darwin_amd64 │ ├── github.com │ └── gopkg.in └── src ├── github.com │ ├── BurntSushi │ ├── justincalleja │ ├── kr │ ├── mitchellh │ └── spf13 └── gopkg.in └── yaml.v1
В нашем случае нам не нужно go get
было анализировать и выяснять, какие зависимости нужны нашему проекту, поскольку у нас есть только одна (которая, в свою очередь, имеет свои собственные зависимости). Мы могли бы достичь того же результата, запустив go get github.com/spf13/viper
из корня нашего рабочего пространства.
Как видите, наши каталоги src , pkg и bin заполнены. Теперь src рекурсивно включает исходный код наших зависимостей (Viper находится на github.com/spf13/viper ). pkg содержит двоичные файлы библиотеки. Эти двоичные файлы не могут быть выполнены, но они могут быть связаны с. В bin находятся исполняемые файлы. Функция main () в useviper.go делает результат построения файла исполняемым двоичным файлом, поэтому он помещается в bin, и мы можем его запустить.
Поскольку мы добавили $ GOPATH / bin в нашу переменную окружения PATH (см. set_gopath
Выше исполняемую функцию), запуск useviper на терминале — это просто вопрос ввода имени файла:, useviper
что возвращает нас «в main».
Затем мы хотим изменить наш исходный код и перестроить. Измените функцию main (), чтобы она выглядела следующим образом:
func main() { viper.SetConfigName("config") // name of config file (without extension) viper.AddConfigPath(".") // path to look for the config file in err := viper.ReadInConfig() if err != nil { fmt.Println("Config not found...") } else { name := viper.GetString("name") fmt.Println("Config found, name = ", name) } }
Чтобы установить (собрать и положить в мусорное ведро ), мы попадаем в ту же ситуацию, что и с go get
. Мы можем либо положиться на каталог, в котором находятся и запустить наши исходные файлы go install
, либо мы можем указать, что устанавливать явно. Мне нравится иметь скрипт goinstall.sh в корне моего рабочего пространства (показано ниже).
#!/bin/bash if [ $# -eq 0 ] then echo "go install github.com/justincalleja/useviper" && go install github.com/justincalleja/useviper else echo "go install github.com/justincalleja/$1" && go install github.com/justincalleja/$1 fi
Я подумал, что может быть полезно установить только с именем проекта (и именем по умолчанию) из корня проекта … но мне еще предстоит достаточно развить в Go, чтобы увидеть, что на самом деле полезно или нет в процессе написания кода.
По сути, все следующее будет установлено useviper
в bin для нас:
useviper_workspace$ goinstall.sh useviper_workspace$ goinstall.sh useviper useviper$ go install
Если вы useviper
сейчас, вы должны получить: «Конфиг не найден…». Но если вы создадите файл с именем config.yaml в каталоге, в котором вы собираетесь запускать useviper
следующее содержимое:
name: viper
You should get back “Config found, name = viper”. Note that we did not need to set the config file’s extension in our main() as Viper picks up YAML, TOML, or JSON files automatically.
That wraps up this quick introduction to some Go lang basics.