эта статьяНачалось вмой блог, если вы найдете это полезным, пожалуйста, поставьте лайк и соберите его, чтобы больше друзей могли его увидеть.
В этой статье я расскажу о некоторых своих мыслях об управлении версиями 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
Добро пожаловать, чтобы обратить внимание на мой публичный номер!