Статьи

Использование Viper для некоторых основ Go

Цель

В этом посте вы узнаете, как использовать  Viper . Он предназначен для людей, которые  плохо  знакомы с языком программирования Go (я только начинаю сам). Это потому, что цель не Viper сама по себе, а процесс выполнения некоторых основ в Go.

Предположения

  • Вы установили Go. В моем случае:  иди версия go1.3.3 darwin / amd64

Настройка

Прежде всего, нам нужно создать каталог для размещения нашей работы, т.е. нам нужно создать рабочее пространство:

Код Go должен храниться в рабочей области. Рабочая область — это иерархия каталогов с тремя каталогами в корне:

  • ЦСИ
  • упак
  • бункер

 Как написать код Go 

$ mkdir useviper_workspace
 
$ cd useviper_workspace
 
useviper_workspace$ mkdir src bin pkg

Далее, давайте создадим каталог, в котором будет размещен наш исходный код для этого поста / вашего проекта. При этом удобно иметь в виду следующие рекомендации:

Пакеты из стандартной библиотеки имеют короткие пути, такие как «fmt» и «net / http». Для ваших собственных пакетов вы должны выбрать базовый путь, который вряд ли будет конфликтовать с будущими дополнениями к стандартной библиотеке или другим внешним библиотекам.

Если вы храните свой код в исходном хранилище, то вам следует использовать корень этого исходного хранилища в качестве базового пути. Например, если у вас есть учетная запись GitHub на github.com/user, это должен быть ваш базовый путь.

Обратите внимание, что вам не нужно публиковать свой код в удаленном хранилище, прежде чем вы сможете его построить. Это просто хорошая привычка организовывать ваш код так, как будто вы когда-нибудь опубликуете его. На практике вы можете выбрать любое произвольное имя пути, если оно уникально для стандартной библиотеки и большей экосистемы Go.

 Как написать код Go 

useviper_workspace$ mkdir -p src/github.com/justincalleja/useviper

Я пойду с  github.com/justincalleja/useviper  и оставлю это на данный момент, так как я не слишком знаком с  go инструментом, чтобы рассказать вам, почему и как. Вскоре мы увидим, что  go его можно использовать для извлечения стороннего исходного кода, который размещен в открытом доступе, и что структура каталогов играет в этом роль, т. Е. Если вы планируете отправить свой код в какое-либо общедоступное хранилище, вы захотите отразить это в структуре каталогов, ведущей к корню исходного кода вашего проекта (например,  github.com/<you> / <имя-проекта> ).

Прежде чем продолжить, вы захотите установить   переменную среды GOPATH :

Переменная среды GOPATH указывает местоположение вашего рабочего пространства.

Ваше рабочее пространство может быть расположено где угодно … Обратите внимание, что это не должен быть тот же путь, что и в вашей установке Go.

 Как написать код 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 из корня нашего рабочего пространства.

Как видите, наши   каталоги srcpkg и  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.