Как быть гибким с управлением версиями Go

Go

эта статьяНачалось вмой блог, если вы найдете это полезным, пожалуйста, поставьте лайк и соберите его, чтобы больше друзей могли его увидеть.

В этой статье я расскажу о некоторых своих мыслях об управлении версиями Go и познакомлю вас с небольшим инструментом gvm. Эта тема также очень проста для разговора, но если вы хотите использовать ее круто, вам все равно нужно немного разобраться.

Введение

Перейти к управлению версиями, а не к управлению зависимостями пакетов. В обычной работе я много раз не сталкиваюсь с таким спросом, поэтому могу не очень хорошо понимать его ценность.

Кратко объясню предысторию написания этой статьи.

Вероятно, самой важной новостью за последние недели стал официальный выпуск Go 1.13 в сентябре. Связанные с ним обновления можно просмотретьGo 1.13 официально выпущен, посмотрим на какие фичи стоит обратить вниманиеили официальныйGo 1.13 Relase Notes.

Для суслика он, возможно, уже давно не в силах сдержать свое беспокойное сердце, и он хочет испытать новую версию апгрейда как можно скорее. Но проблема в том, что переход на новую версию Go обычно сталкивается с некоторыми проблемами, такими как разные версии конфигурации окружения, а установленные вспомогательные инструменты и пакеты могут быть совместимы или перезаписаны под разные версии.

Я, естественно, надеюсь, что есть набор решений, которые помогут мне переключаться между версиями Go и добиться полной изоляции окружения между разными версиями.

План мышления

Когда дело доходит до изоляции среды, есть много вариантов на выбор, таких как несколько хостов, виртуальная машина, контейнер и другие технологии. Все они звучат довольно хорошо, и все они удовлетворяют потребности. Но если это только для управления версиями Go, вы можете реализовать это самостоятельно.

Многоверсионное переключение — это в основном изоляция переменных окружения разных версий. До Go 1.10 нас интересовали переменные GOROOT, GOPATH и PATH. После Go 1.10 GOROOT по умолчанию использует текущий путь установки go, если учитываются GOPATH и PATH.

Недавно я только что ответил на вопрос о переменных среды Go,Посмотреть ответ. Функция каждой переменной подробно описана.

Как добиться

Теперь я хочу свободно переключаться между двумя версиями Go на своем компьютере, как мне это сделать?

Предполагая, что они находятся в каталогах go1.11/ и go1.13/ в каталоге ~/.goversions/sdk/ соответственно. Я хочу включить go 1.11 сейчас, просто запустите следующую команду:

$ export PATH=~/.goversions/sdk/go1.11/bin/:$PATH

На данный момент GOROOT автоматически распознается как ~/.goversions/sdk/go1.11/. Связанные с Go наборы инструментов, исходный код и стандартные библиотеки находятся в этом каталоге.

Но в дополнение к собственной Go есть другие сторонние стандартные библиотеки, скомпилированные файлы библиотек и т. д., которые все расположены в GOPATH.Если не установлено, по умолчанию используется ~/go, что вызовет путаницу при переключении между несколькими версиями. . . . Мы можем установить отдельный GOPATH для каждой версии.

Для go1.11 установите GOPATH в ~/.goversions/gopath/go1.11-global/.

$ mkdir ~/.goversions/gopath/go1.11-global/
$ export GOPATH=~/.goversions/gopath/go1.11-global/

Создается отдельная среда.

Если вы хотите переключиться на 1.13 сейчас, это сделают несколько команд.

$ export PATH=~/.goversions/sdk/go1.13/bin/:$PATH
$ mkdir -pv ~/.goversions/gopath/go1.13-global/
$ export GOPATH=~/.goversions/gopath/go1.13-global/ 

Переключение прошло успешно.

Несмотря на то, что спрос был реализован, он всегда очень неудобен в использовании. Фактически, для удобства работы приведенные выше идеи могут быть доработаны до сценариев оболочки и организованы в набор инструментов.

Вы готовы попробовать?

Но, к сожалению, такой возможности нет, т.к. этот инструмент кем-то разработан, идея похожа, но сильнее того, что здесь описано, это gvm, адресmoovweb/gvm.

что такое гвм

gvm, Go Version Manager, Go version manager, он может очень легко переключать версию Go. По сравнению с другими языками обычно есть похожие инструменты, такие как NVM для NodeJS, virtualenv для Python и т. д.

gvm не только включает в себя упомянутое выше переключение версий, но также может установить любую версию Go напрямую через редактирование исходного кода, конечно, лучшая версия — 1.5 и выше, причина будет объяснена позже.

Довольно смущающий момент, фон gvm не для переключения между различными версиями Go, Команда разработчиков изначально разработала этот инструмент в основном для решения проблемы зависимостей проекта и реализации переключения зависимостей пакетов путем переключения среды. Ниже я покажу, как это сделать.

Но проблема в том, что сейчас управление зависимостями Go становится все совершеннее, официальный модуль go становится все лучше и лучше, а GOPATH постепенно ослабевает. функции разных версий Go.

Столько чепухи, давайте начнем испытывать этот инструмент формально.

Как установить

Установка очень проста, если можно выполнить следующую однострочную команду.

$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

Вывод показывает:

Cloning from https://github.com/moovweb/gvm.git to /home/vagrant/.gvm
which: no go in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/vagrant/.local/bin:/home/vagrant/bin)
No existing Go versions detected
Installed gvm v1.0.22

Please restart your terminal session or to get started right away run
 `source /home/vagrant/.gvm/scripts/gvm`

Установка завершена!

Перезапустите консоль или выполните исходный файл $HOME/.gvm/scripts/gvm, чтобы включить gvm.

Напоминаем, что разные операционные системы также требуют установки соответствующих зависимостей, подробности см.инструкция проектавведение. Здесь нет упоминания о Windows, поэтому я не знаю, доступна ли она.

gvm установить Перейти

gvm компилирует установку Go, загружая исходный код с github. Версия основана на теге в исходном коде. Поскольку в Go реализована самокомпиляция в версии 1.5 и более поздних, для установки Go с помощью gvm нам необходимо заранее иметь доступную среду Go.

Перейти к установке можете прочитать в одной из моих предыдущих статейРассказываем подробно о том, как установить Go, я думаю, что введение довольно подробно.

После завершения установки Go вы можете использовать gvm для установки и переключения любой версии Go по своему желанию.

$ gvm install go1.11

Дождитесь завершения запуска.

Первая установка может занять много времени, в основном зависит от вашей сети, потому что в первый раз вам нужно загрузить исходный код с github.

Посмотреть версию

Прежде всего, давайте проверим, какие версии Go были установлены в моей системе, соответствующий список команд gvm.

$ gvm list

gvm gos (installed)

   go1.11
   go1.12
   go1.13
   go1.13beta1

Установлено 4 версии, из которых go1.13beta1 — нестабильная версия, поэтому, если мы хотим как можно скорее попробовать новые возможности go, gvm по-прежнему очень удобен.

Помимо просмотра установленной версии, вы также можете просмотреть все версии через gvm listall.Версия исходит из тега tag в исходном коде.

$ gvm listall

gvm gos (available)

   go1
   go1.0.1
   go1.0.2
   go1.0.3
   go1.1

   ...

   go1.13
   go1.13beta1
   go1.13rc1
   go1.13rc2

Но эту операцию нельзя выполнить на Mac.В реализации gvm используется команда сортировки Linux, которая несовместима с сортировкой на Mac.

Как с этим бороться?

Установите программное обеспечение coreutils, для которого доступна команда qsort. Его можно установить напрямую с помощью brew install coreutils. Затем модифицируйте файл $HOME/.gvm/scripts/function/tool ​​и измените в нем сортировку на qsort.

выберите версию

Выбор включенной версии очень прост. следующее:

$ gvm use go1.11 [--default]

После успешного включения вы можете подтвердить его с помощью go version и go env. Если вы хотите использовать версию по умолчанию, добавьте параметр --default.

Пакетное управление средой

В дополнение к управлению версией Go, gvm также может управлять средой пакета.Связанные команды: pkgenv и pkgset. Это также очень удобно, если вы не используете инструмент управления зависимостями пакетов.

Для демонстрации примера предположим, что мы хотим создать новый блог проекта, и соответствующую среду можно создать заранее.

$ gvm pkgset create blog  # 创建
$ gvm pkgset use blog     # 启用

Теперь пакеты, которые мы устанавливаем через go get, по умолчанию будут находиться в среде блога. Исходя из принципа, go get по умолчанию поместит установку в первый каталог в GOPATH.

Ну, это все для вступления. Заинтересованные друзья могут учиться дальше. Ведь после го мода эта функция в дальнейшем принципиально не будет использоваться.

структура каталогов gvm

gvm записывается в оболочке и по умолчанию устанавливается в каталог $HOME/.gvm/. Взгляд на его структуру каталогов поможет нам понять его реализацию.

Вот некоторые из основных каталогов:

archive             # go 源码
bin                 # gvm 可执行文件
environments        # 不同环境的环境变量配置
scripts             # gvm 的子命令脚本
logs                # 日志信息
pkgsets             # 每个独立环境 gopath 所在路径

Изучив реализацию gvm, мы обнаружим, что этот набор идей на самом деле применим к управлению версиями многих других инструментов. Если мы столкнемся с такими же требованиями в будущем, даже если у нас нет готовых инструментов, мы можем реализовать набор самостоятельно.

Суммировать

Эта статья начинается с моих потребностей и ведет к теме гибкого управления версиями Go.

Прошлый опыт подсказывает мне, что, поскольку в других языках есть инструменты для удовлетворения таких потребностей, они должны быть и в Go. Я искал и нашел gvm. Хотя я обнаружил некоторые баги и неудачный опыт при его использовании, в целом для моих нужд этого достаточно.

Ссылаться на

Многоверсионный инструмент установки и управления языком Go — gvm
moovweb/gvm
gvm + go mod


Добро пожаловать, чтобы обратить внимание на мой публичный номер!