суббота, 30 января 2021 г.

Модули в Golang: преобразование пакета в модуль

Когда команда go загружает пакет, используя путь к пакету, ей необходимо определить, какой модуль предоставляет пакет.

Команда go запускается с поиска в списке сборки модулей, пути которых являются префиксами пути к пакету. Например, если пакет example.com/a/b импортирован, а модуль example.com/a находится в списке сборки, команда go проверит, содержит ли example.com/a пакет в каталоге b. По крайней мере, один файл с расширением .go должен присутствовать в каталоге, чтобы он считался пакетом. Ограничения сборки для этой цели не применяются. Если только один модуль в списке сборки предоставляет пакет, этот модуль используется. Если пакет предоставляют два или более модуля, выдается сообщение об ошибке. Если ни один модуль не предоставляет пакет, команда go попытается найти новый модуль (если не используются флаги -mod=readonly или -mod=vendor, и в этом случае выдается сообщение об ошибке).

Когда команда go ищет новый модуль для пути к пакету, она проверяет переменную среды GOPROXY, которая представляет собой список URL-адресов прокси, разделенных запятыми, или ключевых слов direct или off. URL-адрес прокси-сервера указывает, что команда go должна связаться с прокси-сервером модуля с использованием протокола GOPROXY. direct указывает, что команда go должна взаимодействовать с системой контроля версий. off означает, что не следует пытаться установить связь. Переменные среды GOPRIVATE и GONOPROXY также можно использовать для управления этим поведением.

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

Например, предположим, что команда go ищет модуль, который предоставляет пакет golang.org/x/net/html, а для GOPROXY установлено значение https://corp.example.com,https://proxy.golang.org. Команда go может делать следующие запросы:

  • На https://corp.example.com/ (параллельно):
    • Запросить последнюю версию golang.org/x/net/html
    • Запросить последнюю версию golang.org/x/net
    • Запросить последнюю версию golang.org/x
    • Запрос последней версии golang.org
  • На https://proxy.golang.org/, если все запросы к https://corp.example.com/ завершились неудачно с 404 или 410:
    • Запросить последнюю версию golang.org/x/net/html
    • Запросить последнюю версию golang.org/x/net
    • Запросить последнюю версию golang.org/x
    • Запрос последней версии golang.org

После того, как подходящий модуль будет найден, команда go добавит новое требование с путем и версией нового модуля в файл go.mod основного модуля (main module). Это гарантирует, что при загрузке того же пакета в будущем тот же модуль будет использоваться с той же версией. Если разрешенный пакет не импортируется пакетом в основном модуле, новое требование будет иметь // indirect комментарий.


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


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

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