В предыдущей статье мы впервые представилиНесколько методов управления сумками, а затем специально представляет инструмент управления пакетами:glide. С выпуском Go 1.11, официального инструмента управления пакетамиGo Modules
стал популярным. В недавно выпущенной версии Go 1.12 расширена поддержкаGo Modules
служба поддержки. В этой статье будет рассказано, как установить и использовать его в проекте.Go Modules
.
Поддержка установки и активации Модулей
предварительное условие
Как упоминалось в начале этой статьи, это поддерживается только начиная с Go 1.11.Go Modules
. Итак, версия Go по умолчанию >= 1.11.
$ go version
go version go1.12 darwin/amd64
Установил последнюю версию 1.12.
Активируйте, чтобы использовать
После установки мы можем активировать поддержку модуля одним из двух способов:
- существует
$GOPATH/src
вызовите команду go из каталога, отличного от текущего каталога или любого из его родительских каталогов с допустимымgo.mod
файл и переменные окруженияGO111MODULE
Не задано (или явно задано значение auto). - установить в наборе переменных окружения
GO111MODULE = on
После этого вызовите команду go.
Как определить модули
Создайте один для текущего проектаgo.mod
документ.
когда проекта нетGOPATH
, непосредственно выполнить:
go mod init
В противном случае произойдет следующая ошибка:
go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'
Поэтому нам нужно активировать Модули вручную:
$ export GO111MODULE=on
затем выполнитьgo mod init
. Это преобразует любой существующий файл dep Gopkg.lock или любую из других девяти поддерживаемых зависимостей, добавивrequire
заявление, чтобы соответствовать существующей конфигурации.
go mod init обычно может использовать вспомогательные данные (например, метаданные системы контроля версий) для автоматического определения пути к соответствующему модулю, но еслиgo mod init
указывает, что он не может автоматически определить путь к модулю, или если вам нужно переопределить путь в противном случае, вы можете указать путь к модулю какgo mod init
необязательные параметры, например:
$ go mod init modtest
строительные блоки
При выполнении из корневого каталога модуля./...
Шаблон соответствует всем пакетам в текущем модуле.go build
Отсутствующие или непереведенные зависимости будут автоматически добавлены по мере необходимости, чтобы выполнить импорт для этого конкретного вызова сборки:
$ go build ./...
тестовый модуль
$ go test ./...
Протестируйте настроенный модуль, чтобы убедиться, что он работает с выбранной версией. Также можно запустить тесты модуля, а также тесты всех прямых и косвенных зависимостей для проверки на несовместимость:
$ go test all
настоящий бой
Создать проект
Создайте проект и перейдите в корневой каталог:
$ mkdir src/hello
$ cd src/hello
инициализация
$ go mod init github.com/keets2012/hello
go: creating new go.mod: module github.com/keets2012/hello
перейдите к инициализации мода и назовите пакет какgithub.com/keets2012/hello
. Как видите, создано вместеgo.mod
документ.
реализовать простой метод
$ cat <<EOF > hello.go
package main
import (
"fmt"
"rsc.io/quote"
)
func main() {
fmt.Println(quote.Hello())
}
EOF
мы создалиhello.go
файл и вывести результат вызванного метода.
выполнение сборки
$ go build # 构建可执行文件
$ ./hello # 执行
Hello, world. # 输出结果
После выполнения сборки мы получаем исполняемый файл, и выполняем его для получения результата.go.mod
Файл был обновлен, чтобы включить явные версии зависимостей, гдеv1.5.2
даsemver
отметка:
$ cat go.mod
module github.com/keets2012/hello
require rsc.io/quote v1.5.2
Обновление и понижение зависимостей
следует использоватьgo get
для выполнения ежедневных обновлений и понижений зависимостей, которые будут обновляться автоматическиgo.mod
документ. Или вы можете редактировать напрямуюgo.mod
.
Так же какgo build
,go test
или дажеgo list
Такая команда автоматически добавит новые зависимости, необходимые для выполнения импорта.
Чтобы просмотреть доступные второстепенные обновления и обновления программы исправлений для всех прямых и косвенных зависимостей:
go list -u -m all
Чтобы обновить до последней версии все прямые и косвенные зависимости текущего модуля:
- бегать
go get -u
Используйте последнюю вторичную версию или версию исправления -
go -u = patch
Используйте последнюю версию патча
Чтобы обновить или перейти на более конкретную версию,go get
Разрешено добавлением в параметр пакета@version
суффикс или «запрос модуля», чтобы переопределить выбор версии, например.go get foo@v1.6.2
,go get foo @ e3702bed2
,илиgo foo @'<v1.6.2'
.
semver
В предыдущем подразделе мы упоминалиsemver
. Наилучшая практика, официально рекомендованная golang, называется semver, что является аббревиатурой.Semantic Versioning
, что является семантической версией.
Семантическое определение
С точки зрения непрофессионала, это четкий и удобочитаемый формат версии, который четко отражает информацию о версии. Более подробные спецификации можно найти здесь.
Как говорится в спецификации, это выглядит такvX.Y.Z
Форма явно более интуитивно понятна, чем строка хэшей, поэтому разработчики golang сосредоточатся на этом.
Зачем использовать семантическое управление версиями
Роль упрощенной спецификации версии semver очевидна, но сама по себе эта причина, очевидно, немного неубедительна.Строгие ограничения на версию через semver могут максимизировать обратную совместимость и избежать «критических изменений», а это преследует golang. Эти двое поладили, так чтоgo modules
Предоставляется семантическая поддержка версий.
Если вы используете и распространяете пакеты без тегов версии или в версии 1.x, то вы, вероятно, не заметите никакой разницы, т.к.go mod
Поддерживаемые форматы следуют несколько раз от начала до конца, основное отличие заключается в пакетах версии 2.0.0 и более поздних.
«Если старый пакет и новый пакет имеют один и тот же путь импорта, новый пакет должен быть обратно совместим со старым пакетом» — go modules wiki
Объекты с одинаковыми именами должны быть обратно совместимыми.Однако, в соответствии с соглашением о семантической версии, появление версии 2.0.0 должно означать, что произошло серьезное изменение, и весьма вероятно, что обратную совместимость нельзя гарантировать. делать в это время?
Ответ очень прост, мы можем добавить информацию о версии в конец пути импорта пакета, например:
module my-module/v2
require (
some/pkg/v2 v2.0.0
some/pkg/v2/mod1 v2.0.0
my/pkg/v3 v3.0.1
)
Формат резюмируется какpkgpath/vN
, где N — основной номер версии больше 1. Эта информация о версии также должна быть прикреплена при импорте в код, напримерimport "some/pkg/v2"
. Таким образом, путь импорта пакета изменился, и не нужно беспокоиться об ограничении обратной совместимости объектов с одинаковым именем, потому что golang считает, что разные пути импорта означают разные пакеты. Бывают, конечно, непредвиденные ситуации:
- Эквивалентное требование gopkg.in/some/pkg.v2 v2.0.0 можно использовать при использовании формата gopkg.in.
- добавить информацию о версии
+incompatible
Возможно, вам не нужно указывать/vN
,Например:require some/pkg v2.0.0+incompatible
В других случаях, если вы используете его напрямуюv2+
версия приведет кgo mod
сообщить об ошибке.
Версия пакета v2+ может сосуществовать с другими пакетами других основных версий (при условии, что добавленный/vN
), они будут рассматриваться как отдельные пакеты.
Кроме того/vN
Это не повлияет на ваш склад, вам не нужно создавать соответствующий склад v2, это простоgo modules
Просто добавлена дополнительная информация.
Конечно, если вы не хотите следовать этой спецификации или нуждаетесь в совместимости с существующим кодом, укажите+incompatible
будет разумным выбором. ноgo modules
Такое поведение не рекомендуется.
Используйте каталог поставщиков
Если тебе не нравитсяgo mod
Для кэширования можно использоватьgo mod vendor
Вернитесь в каталог поставщика, используемый godep или govendor для управления пакетами.
Конечно, эта команда не позволяет вам переходить с таких инструментов, как godep, наgo modules
, это просто ставитgo.sum
Загрузите все зависимости в каталоге поставщика.Если вы используете его для переноса godep, вы обнаружите, что пакеты в каталоге поставщика будут сильно отличаться от пакетов, указанных для godep, поэтому, пожалуйста, не делайте этого.
использоватьgo build -mod=vendor
построить проект, потому что вgo modules
в режимеgo build
Он блокирует механизм вендора, поэтому для перезапуска механизма вендора требуются определенные параметры:
go build -mod=vendor
./hello
hello world!
Построить удалось. При публикации нужно только привести директорию вендора как с godep.
Суммировать
Эта статья в основном знакомитgo modules
Некоторые особенности и использование ,go modules
Это официальный инструмент управления пакетами.Язык Go представляет еще один рабочий режим инструмента Go, вводя концепцию модуля.module-aware mode
. В новом режиме работы модуль поддерживает управление версиями зависимостей пакетов.
Новый режим работы также приносит некоторые проблемы, в материковой части мы не можем пройти напрямуюgo get
Команда получает некоторые сторонние пакеты, наиболее распространенными из которых являютсяgolang.org/x
Различные отличные пакеты ниже. После работы под модулем,go build
больше не будут заботиться о пакетах под GOPATH или поставщиком, ноGOPATH/pkg/mod
Проверьте есть ли кеш, если нет, то загрузит определенную версию модуля, а для некоторых пакетов модуля часто глючит на материке. В следующей статье мы представим реализацию конфигурации прокси модуля go.
Рекомендуемое чтение
Инструмент управления пакетами для Go