Есть острая необходимость, чтобы наш Go-проект имел внешние зависимые пакеты исходников от сторонних разработчиков рядом с исходными кодами самого проекта.
И причем нужно иметь зависимые пакеты определенной версии, а то вдруг через 2-3 месяца мы не сможем собрать наш проект на Go! из-за того что зависимости сильно изменились и мы вынужденны будем тратить время на рефакторинг нашего проекта под новые реалии, а времени у нас в обрез! 😉
Для этих целей нам нужен менеджер зависимостей нашего проекта с пакетами исходников от сторонних разработчиков, да и чтобы он работал по аналогии как это делает в php менеджер composer или как это делает в nodejs менеджер npm.
Тут нам приходит на помощь GB (https://getgb.io/)!
Это менеджер зависимостей предназначенный для Go-проектов и работает он аналогично как в php это делает composer!
Да и с помощью GB можно собирать наши проекты, без привязки к $GOPATH из переменного окружения операционки!
В итоге: GB — это то что нам нужно!
Для начала вам нужно установить Go-lang на сервер на ваш сервер.
В ssh консоли сервера делаем следующее:
go get github.com/constabulary/gb/...
Вывод:
а его и не будет, ведь это Go и с ним проще жизнь...
Теперь давайте поиграемся с GB. Мы создадим тестовое приложение и используя GB скачаем наш зависимый пакет и соберем тестовый проект.
В консоли переходим в домашнюю папку и создаем папку для go-проектов, а затем переходим в нее:
cd ~ && mkdir gb-projects && cd gb-projects
Затем нам надо создать диру «src«, где будут находиться проекты на golang и диру под тестовый проект:
mkdir -p src/gb-test
Смотрим нашу структуру папок:
tree $(pwd)
Вывод:
$ tree $(pwd)
/root/gb-projects
└── src
└── gb-test
2 directories, 0 files
Теперь пора нам создать наш тестовый проект и создавать будем его на базе веб-сервера martini, чтобы наше go-приложение было еще и веб-сервером (о как!), которое может отрабатывать HTTP запросы.
В консоли делаем:
cat > src/gb-test/main.go <<END
package main
import "github.com/go-martini/martini"
func main() {
m := martini.Classic()
m.Get("/", func() string {
return "Hello world!"
})
m.Run()
}
END
Вывод:
$ cat > src/gb-test/main.go <<END
> package main
>
> import "github.com/go-martini/martini"
>
> func main() {
> m := martini.Classic()
> m.Get("/", func() string {
> return "Hello world!"
> })
> m.Run()
> }
> END
Отлично! Наша go-программа практически готова! Теперь пора собрать ее см помощью GB.
Делаем:
gb build
Вывод:
$ gb build FATAL: command "build" failed: failed to resolve import path "gb-test": import "github.com/go-martini/martini": not found: stat /home/monitor/gb-projects/src/github.com/go-martini/martini: no such file or directory
Вот это нежданчик нас поймал. А суть в том, что мы в исходниках «main.go» указали пакетную зависимость «github.com/go-martini/martini» от которого зависит наш go-проект.
Теперь устанавливаем через gb нужным нам пакет:
gb vendor fetch github.com/go-martini/martini
Вывод:
$ gb vendor fetch github.com/go-martini/martini fetching recursive dependency github.com/codegangsta/inject
Снова смотрим нашу структуру папок:
tree $(pwd)
Вывод:
$ tree $(pwd)
/root/gb-projects
├── src
│ └── gb-test
│ └── main.go
└── vendor
├── manifest
└── src
└── github.com
├── codegangsta
│ └── inject
│ ├── LICENSE
│ ├── README.md
│ ├── inject.go
│ ├── inject_test.go
│ ├── translations
│ │ └── README_zh_cn.md
│ └── update_readme.sh
└── go-martini
└── martini
├── Godeps
│ └── Godeps.json
├── LICENSE
├── README.md
├── env.go
├── env_test.go
├── go_version.go
├── logger.go
├── logger_test.go
├── martini.go
├── martini_test.go
├── recovery.go
├── recovery_test.go
├── response_writer.go
├── response_writer_test.go
├── return_handler.go
├── router.go
├── router_test.go
├── static.go
├── static_test.go
├── translations
│ ├── README_de_DE.md
│ ├── README_es_ES.md
│ ├── README_fr_FR.md
│ ├── README_ja_JP.md
│ ├── README_ko_kr.md
│ ├── README_pl_PL.md
│ ├── README_pt_br.md
│ ├── README_ru_RU.md
│ ├── README_tr_TR.md
│ ├── README_zh_cn.md
│ └── README_zh_tw.md
└── wercker.yml
12 directories, 39 files
Обратите внимание, что теперь у нас появился файл проекта «src/gb-test/main.go» и папка с вендорами «src/gb-test/vendor» — вот в эти папки gb и кладет наши зависимости.
Пробуем снова собрать проект:
gb build
Вывод:
$ gb build github.com/codegangsta/inject github.com/go-martini/martini gb-test
Теперь все собралось без сучка и задоринки.
Проверяем работу нашего веб-сервера:
bin/gb-test
Вывод:
$ bin/gb-test [martini] listening on :3000 (development)
Приложение успешно запустилось.
Теперь тестируем его работу из другого ssh-терминала:
curl "http://localhost:3000/" -v
Вывод:
$ curl "http://localhost:3000/" -v * Trying 127.0.0.1... * Connected to localhost (127.0.0.1) port 3000 (#0) > GET / HTTP/1.1 > Host: localhost:3000 > User-Agent: curl/7.47.0 > Accept: */* > < HTTP/1.1 200 OK < Date: Wed, 24 Jan 2018 13:08:58 GMT < Content-Length: 12 < Content-Type: text/plain; charset=utf-8 < * Connection #0 to host localhost left intact Hello world!
Ну еще из браузера посмотрим результат: http://localhost:3000/

Я вас поздравляю! Вы написали свой первый веб-сервер на Go! и освоили работу с менеджером зависимостей GB.
Удачных вам начинаний с Go! 😉
Ссылки
- https://habrahabr.ru/post/259967/ — gb — менеджмент зависимостей для Go
- https://getgb.io/ — gb · A project based build tool for Go
- https://github.com/go-martini/martini/blob/master/translations/README_ru_RU.md — Martini — мощный пакет для быстрой разработки веб приложений и сервисов на Golang.