Есть острая необходимость, чтобы наш 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.