вторник, 16 февраля 2021 г.

Модули в Golang: команды с поддержкой модулей, go get

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

go get [-d] [-t] [-u] [build flags] [packages]

Примеры:

# Установить последнюю версию инструмента.
$ go get golang.org/x/tools/cmd/goimports

# Обновить конкретный модуль.
$ go get -d golang.org/x/net

# Обновить модули, которые предоставляют пакеты, 
# импортированные пакетами в основном модуле.
$ go get -d -u ./...

# Обновить или вернуть определенную версию модуля.
$ go get -d golang.org/x/text@v0.3.2

# Обновление до коммита в главной ветке модуля.
$ go get -d golang.org/x/text@master

# Удалить зависимость от модуля и понизить версию модулей, 
# которые требуют этого, в версии, которые этого не требуют.
$ go get -d golang.org/x/text@none

Команда go get обновляет зависимости модуля в файле go.mod для основного модуля (main module), а затем создает и устанавливает пакеты, перечисленные в командной строке.

Первый шаг - определить, какие модули нужно обновить. go get принимает в качестве аргументов список пакетов, шаблонов пакетов и пути модулей. Если указан аргумент пакета, go get обновляет модуль, который предоставляет пакет. Если указан шаблон пакета (например, all или путь с подстановочным знаком ...), go get расширяет шаблон до набора пакетов, а затем обновляет модули, которые предоставляют пакеты. Если аргумент называет модуль, но не пакет (например, модуль golang.org/x/net не имеет пакета в корневом каталоге), go get обновит модуль, но не создаст пакет. Если аргументы не указаны, go get действует как будто . (точка) была указана (пакет в текущем каталоге); его можно использовать вместе с флагом -u для обновления модулей, которые предоставляют импортированные пакеты.

Каждый аргумент может включать суффикс запроса версии, указывающий на желаемую версию, например go get golang.org/x/text@v0.3.0. Суффикс запроса версии состоит из символа @, за которым следует запрос версии, который может указывать на конкретную версию (v0.3.0), префикс версии (v0.3), имя ветви или тега (master), ревизию (1234abcd), или один из специальных запросов latest, upgrade, patch, или none. Если версия не указана, go get использует запрос @upgrade.

После того, как go get разрешил свои аргументы для определенных модулей и версий, go get добавит, изменит или удалит директивы require в файле go.mod основного модуля, чтобы гарантировать, что модули останутся в желаемых версиях в будущем. Обратите внимание, что требуемые версии в файлах go.mod являются минимальными версиями и могут автоматически увеличиваться по мере добавления новых зависимостей. См. Выбор минимальной версии (MVS) для получения подробной информации о том, как выбираются версии и разрешаются конфликты с помощью команд с поддержкой модуля.

Другие модули могут быть обновлены при добавлении, обновлении или понижении версии модуля, указанного в командной строке, если для новой версии указанного модуля требуются другие модули более высоких версий. Например, предположим, что модуль example.com/a обновлен до версии v1.5.0, и для этой версии требуется модуль example.com/b версии v1.2.0. Если в настоящее время требуется модуль example.com/b для версии v1.1.0, перейдите по ссылке get example.com/a@v1.5.0, чтобы также обновить example.com/b до версии v1.2.0.

Другие модули могут быть переведены на более раннюю версию, когда модуль, указанный в командной строке, будет понижен или удален. Чтобы продолжить приведенный выше пример, предположим, что версия модуля example.com/b понижена до версии 1.1.0. Модуль example.com/a также будет понижен до версии, для которой требуется example.com/b версии v1.1.0 или ниже.

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

Если модуль требуется в двух разных версиях (явно указанных в аргументах командной строки или для выполнения обновлений и понижения версий), go get сообщит об ошибке.

После того, как go get выбрал новый набор версий, он проверяет, отозваны (retracted) ли какие-либо недавно выбранные версии модулей или модули, предоставляющие пакеты, указанные в командной строке. go get выводит предупреждение для каждой найденной отозванной версии. go list -m -u all может использоваться для проверки отзывов во всех зависимостях.

После того, как go get обновляет файл go.mod, он собирает пакеты, указанные в командной строке. Исполняемые файлы будут установлены в каталог, названный переменной среды GOBIN, которая по умолчанию имеет значение $GOPATH/bin или $HOME/go/bin, если переменная среды GOPATH не установлена.

go get поддерживает следующие флаги:

  • Флаг -d сообщает go get не собирать и не устанавливать пакеты. Когда используется -d, go get будет управлять только зависимостями в go.mod.
  • Флаг -u указывает перейти к обновлению модулей, предоставляющих пакеты, импортированные прямо или косвенно пакетами, указанными в командной строке. Каждый модуль, выбранный с помощью -u, будет обновлен до своей последней версии, если он уже не требуется в более поздней версии (предварительный выпуск, pre-release).
  • Флаг -u=patch (не -u patch) также сообщает go get обновлять зависимости, но go get обновит каждую зависимость до последней версии исправления (аналогично запросу @patch version).
  • Флаг -t сообщает go get рассмотреть модули, необходимые для создания тестов пакетов, названных в командной строке. Когда -t и -u используются вместе, go get также обновит тестовые зависимости.
  • Флаг -insecure больше не должен использоваться. Это позволяет go get разрешать настраиваемые пути импорта и выборку из репозиториев и прокси-серверов модулей с использованием небезопасных схем, таких как HTTP. Переменная среды GOINSECURE обеспечивает более детальный контроль, и ее следует использовать вместо этого флага.

Начиная с Go 1.16, go install - это рекомендуемая команда для сборки и установки программ. При использовании с суффиксом версии (например, @latest или @v1.4.6) go install создает пакеты в режиме с поддержкой модулей, игнорируя файл go.mod в текущем каталоге или любом родительском каталоге, если он есть.

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


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


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

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