пятница, 5 марта 2021 г.

Модули в Golang: системы контроля версий, поиск репозитория для пути к модулю

Команда go может загружать исходный код модуля и метаданные непосредственно из репозитория системы управления версиями. Загрузка модуля с прокси-сервера обычно происходит быстрее, но подключение напрямую к репозиторию необходимо, если прокси недоступен или если репозиторий модуля недоступен для прокси (часто это верно для частных репозиториев). Поддерживаются Git, Subversion, Mercurial, Bazaar и Fossil. Инструмент управления версиями должен быть установлен в каталоге в PATH, чтобы команда go могла его использовать.

Чтобы загрузить определенные модули из исходных репозиториев вместо прокси, установите переменные среды GOPRIVATE или GONOPROXY. Чтобы настроить команду go для загрузки всех модулей непосредственно из исходных репозиториев, установите GOPROXY на direct.

Поиск репозитория для пути к модулю

Когда команда go загружает модуль в прямом (direct) режиме, она начинает с поиска репозитория, содержащего модуль.

Если путь к модулю имеет квалификатор VCS (один из .bzr, .fossil, .git, .hg, .svn) в конце компонента пути, команда go будет использовать все до этого квалификатора пути в качестве URL-адреса репозитория. Например, для модуля example.com/foo.git/bar команда go загружает репозиторий по адресу example.com/foo.git с помощью git, ожидая найти модуль в подкаталоге bar. Команда go угадывает используемый протокол на основе протоколов, поддерживаемых инструментом контроля версий.

Если путь к модулю не имеет квалификатора, команда go отправляет HTTP-запрос GET на URL-адрес, полученный из пути к модулю, со строкой запроса ?go-get=1. Например, для модуля golang.org/x/mod команда go может отправлять следующие запросы:

https://golang.org/x/mod?go-get=1 (предпочтительно)
http://golang.org/x/mod?go-get=1  (резерв, только с GOINSECURE)

Команда go следует перенаправлениям, но в остальном игнорирует коды состояния ответа, поэтому сервер может ответить 404 или любым другим статусом ошибки. Переменная среды GOINSECURE может быть установлена для разрешения отката и перенаправления на незашифрованный HTTP для определенных модулей.

Сервер должен ответить HTML-документом, содержащим тег <meta> в заголовке документа. Тег <meta> должен появиться в начале документа, чтобы не запутать ограниченный синтаксический анализатор команды go. В частности, он должен появляться перед любым необработанным JavaScript или CSS. Тег <meta> должен иметь форму:

<meta name="go-import" content="root-path vcs repo-url">

root-path - это корневой путь репозитория, часть пути модуля, соответствующая корневому каталогу репозитория. Это должен быть префикс или точное совпадение пути запрошенного модуля. Если это не точное совпадение, делается другой запрос префикса для проверки совпадения тегов <meta>.

vcs - это система контроля версий. Это должно быть одно из следующих значений: bzr, fossil, git, hg, svn, mod. Схема mod указывает команде go загрузить модуль с заданного URL-адреса с использованием протокола GOPROXY. Это позволяет разработчикам распространять модули, не открывая исходные репозитории.

repo-url - это URL-адрес репозитория. Если URL-адрес не включает схему (либо потому, что путь к модулю имеет квалификатор VCS, либо потому, что в теге <meta> отсутствует схема), команда go будет пробовать каждый протокол, поддерживаемый системой контроля версий. Например, с Git команда go попробует https://, затем git+ssh://. Небезопасные протоколы (например, http:// и git://) могут использоваться только в том случае, если путь к модулю совпадает с переменной среды GOINSECURE.

В качестве примера снова рассмотрим golang.org/x/mod. Команда go отправляет запрос на https://golang.org/x/mod?go-get=1. Сервер отвечает HTML-документом, содержащим тег:

<meta name="go-import" content="golang.org/x/mod git https://go.googlesource.com/mod">

Из этого ответа команда go будет использовать репозиторий Git по удаленному URL-адресу https://go.googlesource.com/mod.

GitHub и другие популярные службы хостинга отвечают на запросы ?go-get=1 для всех репозиториев, поэтому обычно не требуется настройка сервера для модулей, размещенных на этих сайтах.

После того, как URL-адрес репозитория будет найден, команда go клонирует репозиторий в кеш модуля. Как правило, команда go пытается избежать получения ненужных данных из репозитория. Однако фактические используемые команды зависят от системы управления версиями и могут изменяться со временем. Для Git команда go может выводить список наиболее доступных версий без загрузки коммитов. Обычно она извлекает коммиты без загрузки коммитов-предков, но иногда это необходимо.


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


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

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