Версионирование в Golang с vgo
В Go есть простая стандартная команда go get
, которая скачивает зависимости. Эта команда устанавливает последнюю версию, из master
ветки репозитория.
Это отлично подходит для небольших одиночных проектов. Но что если имеется два проекта которые зависят от разных версий одной сторонней библиотеки?
Versioned Go Command (vgo)
В Golang
версии 1.10 нам предоставили Versioned Go Command сокращенно vgo
. Эта консольная команда позволяет загружать и импортировать необходимые версии библиотек.
Проект находится в статусе активной разработки и для продакшена рекомендуют пока использовать dep
.
Установка
Перед установкой убедитесь что у вас установлен go
версии 1.10 или выше.
Устанавливается vgo
так же как и любой другой пакет в go
, просто выполните в консоли команду $ go get -u golang.org/x/vgo
.
Так как vgo
наследует все стандартные команды go
, то для начала работы нужно всего лишь начать использовать $ vgo
вместо $ go
.
Инициализация
Для инициализации перейдите в папку проекта и выполните $ vgo get -u
.
vgo
скачает и установит последние версии зависимостей:
$GOPATH/src/v/cache/github.com/cznic/golex
$GOPATH/src/v/cache/github.com/cznic/golex/@v
$GOPATH/src/v/cache/github.com/yookoala/realpath
$GOPATH/src/v/cache/github.com/yookoala/realpath/@v
$GOPATH/src/v/github.com/cznic/golex@v0.0.0-20170803123110-4ab7c5e190e4
$GOPATH/src/v/github.com/yookoala/realpath@v0.0.0-20171103131550-d19ef9c409d9
Также будет создан файл go.mod
с информацией о текущем проекте:
$ cat ./go.mod
module github.com/z7zmey/php-parser
require (
github.com/cznic/golex v0.0.0-20170803123110-4ab7c5e190e4
github.com/yookoala/realpath v0.0.0-20171103131550-d19ef9c409d9
)
module
содержит название проекта, и говорит vgo
что импортировать пакеты начинающиеся с github.com/z7zmey/php-parser
нужно из текущей папки.
Секция require
содержит список зависимостей проекта и их версии.
Как разрешаются версии зависимостей?
vgo
рекурсивно скачивает и устанавливает зависимости. Дочерние зависимости также будут установлены даже если родительская библиотека не содержит go.mod
файл.
Допустим мы имеем список библиотек их зависимости:
В случае конфликта версий, будет использована максимальная версия из списка конфликтующих зависимостей.
Давайте разберем подробнее. В примере выше A v1.0
напрямую зависит от C v1.0
, а через B v1.0
от C v1.3
. Получается, чтобы собрать A v1.0
нужно выбрать и установить одну из версий: C v1.0
или C v1.3
. В этом случае будет установлена C v1.3
даже при условии что максимальная доступная версия C v1.5
.
$ vgo list -m
MODULE VERSION
A -
B v1.0.0
C v1.3.0
E v1.0.0
Вендоринг
Начиная с версии 1.6 Golang
поддерживает импорт пакетов из папки ./vendor
. Это позволяет сохранить все необходимые для сборки зависимости в репозитории проекта.
vgo
имеет несколько команд для работы с папкой для вендоров.
$ vgo vendor
— загружает все найденные зависимости с учетом версий. Репозитории будут склонированы без директории .git
и не будут хранить в себе всю историю изменений библиотеки.
$ vgo verify
— сопоставляет хеши библиотек с теми которые были сохранены при установке. Это подтвердит что в папке ./vendor
находятся необходимые для сборки версии библиотек.
Бонусы
- Благодаря
vgo
код проекта можно разместить в любом месте вне$GOPATH
$ vgo test all
запускает все тесты проекта и зависимостейvgo
клонирует и сохраняет репозитории без истории изменений без.git
директории
Более подробно про vgo
можно почитать тут: vgo-tour
Автор: мистер Олимпия