среда, 10 июля 2019 г.

Команда go get в режиме с поддержкой модулей

Команда 'go get' меняет поведение в зависимости от того, выполняется ли команда go в режиме с поддержкой модулей или в старом режиме GOPATH. Этот текст справки, доступный как 'go help module-get' даже в устаревшем режиме GOPATH, описывает 'go get', так как он работает в режиме с поддержкой модулей (module-aware mode).

Использование:

go get [-d] [-m] [-u] [-v] [-insecure] [build flags] [packages]

get разрешает и добавляет зависимости в текущий модуль разработки, а затем собирает и устанавливает их.

Первый шаг - определить, какие зависимости добавить.

Для каждого именованного пакета или шаблона пакета get должен решить, какую версию соответствующего модуля использовать. По умолчанию get выбирает последнюю версию релиза с тегами, такую как v0.4.5 или v1.2.3. Если нет версий с тегами, get выбирает последнюю версию с тегами, например, v0.0.1-pre1. Если нет версий с тегами, get выбирает последний известный коммит.

Этот выбор версии по умолчанию можно переопределить, добавив суффикс @version к аргументу пакета, как в 'go get golang.org/x/text@v0.3.0'. Для модулей, хранящихся в репозиториях с системой контроля версий, суффиксом версии также может быть хеш коммита, идентификатор ветви или другой синтаксис, известный системе контроля версий, как в 'go get golang.org/x/text@master'. Суффикс версии @latest явно запрашивает поведение по умолчанию, описанное выше.

Если рассматриваемый модуль уже является зависимостью текущего модуля разработки, то get обновит требуемую версию. Указание версии более ранней, чем текущая требуемая версия, является действительным и понижает зависимость. Суффикс версии @none указывает, что зависимость должна быть полностью удалена, понижение или удаление модулей в зависимости от нее по мере необходимости.

Хотя get по умолчанию использует последнюю версию модуля, содержащего именованный пакет, он не использует последнюю версию зависимостей этого модуля. Вместо этого он предпочитает использовать конкретные версии зависимостей, запрошенные этим модулем. Например, если для последней версии A требуется модуль B v1.2.3, в то время как B v1.2.4 и v1.3.1 также доступны, то 'go get A' будет использовать самую последнюю версию A, но затем использовать B v1.2.3, как того требует A . (Если для конкретного модуля существуют конкурирующие требования, то 'go get' разрешает эти требования, выбирая максимально запрашиваемую версию.)

Флаг -u предписывает обновить зависимости для использования более новых минорных или исправлений, когда они доступны. Продолжая предыдущий пример, 'go get -u A' будет использовать самую последнюю версию A с B v1.3.1 (не B v1.2.3).

Флаг -u=patch (не -u patch) дает указание обновить зависимости, чтобы использовать более новые выпуски исправлений, когда они доступны. Продолжая предыдущий пример, 'go get -u=patch A' будет использовать самую последнюю версию A с B v1.2.4 (не B v1.2.3).

В общем, добавление новой зависимости может потребовать обновления существующих зависимостей, чтобы сохранить работоспособную сборку, и 'go get' делает это автоматически. Точно так же, понижение одной зависимости может потребовать понижения других зависимостей, и 'go get' также делает это автоматически.

Флаг -m дает указание остановиться здесь после разрешения, обновления и понижения модулей и обновления go.mod. При использовании -m каждый указанный путь к пакету также должен быть путем к модулю, а не путем импорта пакета ниже корня модуля.

Флаг -insecure разрешает выборку из репозиториев и разрешение пользовательских доменов с использованием небезопасных схем, таких как HTTP. Используйте с осторожностью.

Вторым шагом является загрузка (при необходимости), сборка и установка именованных пакетов.

Если аргумент присваивает имя модулю, а не пакету (так как в корневом каталоге модуля нет исходного Go кода), то этап установки пропускается для этого аргумента, а не вызывает ошибку сборки. Например, 'go get golang.org/x/perf' успешно выполняется, даже если нет кода, соответствующего этому пути импорта.

Обратите внимание, что шаблоны пакетов разрешены и раскрываются после разрешения версий модуля. Например, 'go get golang.org/x/perf/cmd/...' добавляет последнюю версию golang.org/x/perf, а затем устанавливает команды в этой последней версии.

Флаг -d указывает get загрузить исходный код, необходимый для сборки именованных пакетов, включая загрузку необходимых зависимостей, но не создавать и устанавливать их.

Без аргументов пакета 'go get' применяется к основному модулю и к пакету Go в текущем каталоге, если таковые имеются. В частности, 'go get -u' и 'go get -u=patch' обновляют все зависимости основного модуля. Без аргументов пакета, а также без -u 'go get' не намного больше, чем 'go install', а 'go get -d' не намного больше, чем 'go list'.

Для получения дополнительной информации о модулях см. go help modules.

Подробнее об указании пакетов см. go help packages.

Этот текст описывает поведение get используя модули для управления исходным кодом и зависимостями. Если вместо этого команда go выполняется в режиме GOPATH, информация о флагах и эффектах get изменяется, как и 'go help get'. Смотрите go help modules и go help gopath-get.

Смотрите также: go build, go install, go clean, go mod.


Читайте также:


Комментариев нет:

Отправить комментарий