Как стать автором
Обновить

Версионирование в Golang с vgo

Версионирование в 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 файл.


Допустим мы имеем список библиотек их зависимости:


dependency graph


В случае конфликта версий, будет использована максимальная версия из списка конфликтующих зависимостей.


Давайте разберем подробнее. В примере выше 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

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.