Импорт. Зависимости
В этой главе мы научимся устанавливать сторонние пакеты, а также разберемся как работать с зависимостями и переменной окружения GOPATH.
Добавляем фреймворк echo
Для создания нашего web-сервиса, вместо стандартной библиотеки воспользуемся популярным web-фреймворком echo.
Добавим в секцию import фреймворк.
import (
"github.com/labstack/echo"
"net/http"
)
Если мы попробуем запустить наш файл командой go run src/app/main.go
, то получим
ошибку imported and not used: "app/vendor/github.com/labstack/echo"
это связано с тем,
что в Go, если мы что-то объявляем или импортируем, то мы обязаны это использовать. Все неиспользуемые
импорты и переменные должны быть удалены из кода перед компиляцией. Это требование может
показаться излишне строгим, однако оно помогает держать код "в чистоте".
Давайте перепишем функции handler
и main
c использованием фреймворка.
func handler(c echo.Context) error {
return c.String(http.StatusOK, "hello world")
}
Вместо двух аргументов у нас теперь один с типом echo.Context
. Данный тип позволит
более удобно работать с HTTP запросом и ответом. Например, мы избавились от приведения
типов.
Кроме того, функция обработчика теперь возвращает значение с типом error
- это встроенный в
язык интерфейс, в котором описан только один метод Error
.
type error interface {
Error() string
}
func main() {
e := echo.New()
e.GET("/", handler)
e.Start(":8080")
}
Как видим, место стандартного http сервера занял фреймворк echo. В остальном код особо не изменился.
Попробуем снова запусить программу командой run. В результате увидим ошибку.
main.go:4:2: cannot find package "github.com/labstack/echo" in any of:
и далее
список директорий, в которых компилятор пытался найти пакет.
GOPATH
Переменная окружения GOPATH определяет, где компилятор будет искать
пакеты, указанные в секции import
. Как и PATH, GOPATH может содержать несколько
директорий, разделенных двоеточием (unix). Сначала пакет будет искаться в первой
указанной директории, затем во второй и т.д.
Чтобы получить текущее значение GOPATH наберите go env GOPATH
Структура директорий указанных в GOPATH предопределена и содержит три основных поддиректории:
- src - исходные коды
- pkg - скомпилированные пакеты
- bin - выполняемые файлы
Обычно в примерах, которые можно найти в интернет, для установки библиотек и
зависимостей используется команда go get
. Эта команда скачивает и устанавливает
библиотеку в директорию, указанную в переменной окружения GOPATH.
Зависимости
Однако go get
не умеет разрешать зависимости и учитывать версии пакетов
как это делает composer.
Для решения этой проблемы, начиная с версии 1.6 Go поддерживает использование
папки vendor, в которой прежде всего будут искаться сторонние пакеты, указанные в секции
import
.
Подробную информацию о GOPATH и папке vendor можно получить, набрав команду go help gopath
Для Go было написано много аналогов composer, однако на данный момент существует официальный экспериментальный инструмент dep. На нем мы и остановимся.
Чтобы установить dep наберите go get -u github.com/golang/dep/cmd/dep
Наберите dep init src/app
для того, чтобы установить все зависимости для
нашего web-сервиса.
В результате выполнения данной комманды в папке src/app
будут созданы
файлы Gopkg.lock
, Gopkg.toml
- аналоги composer.lock
и composer.json
А так же папка vendor
, в которую скачаны необходимые пакеты.
Код находится в src/import_and_deps
.