Установка пакетного менеджера для Go

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

Ссылки

Оставить ответ