четверг, 18 марта 2021 г.

Модули в Golang: кеш модуля

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

Расположение кеша модуля по умолчанию - $GOPATH/pkg/mod. Чтобы использовать другое расположение, установите переменную среды GOMODCACHE.

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

Кеш может использоваться несколькими проектами Go, разработанными на одной машине. Команда go будет использовать один и тот же кеш независимо от расположения основного модуля. Несколько экземпляров команды go могут одновременно безопасно обращаться к одному и тому же кешу модуля.

Команда go создает исходные файлы модулей и каталоги в кеше с разрешениями только для чтения, чтобы предотвратить случайные изменения модулей после их загрузки. Это имеет неприятный побочный эффект, затрудняя удаление кеша с помощью таких команд, как rm -rf. Вместо этого кеш можно удалить с помощью go clean -modcache. В качестве альтернативы, когда используется флаг -modcacherw, команда go создаст новые каталоги с разрешениями на чтение и запись. Это увеличивает риск того, что редакторы, тесты и другие программы изменят файлы в кеше модуля. Команду go mod verify можно использовать для обнаружения изменений зависимостей основного модуля. Он сканирует извлеченное содержимое каждой зависимости модуля и подтверждает, что оно соответствует ожидаемому хешу в go.sum.

Ниже объясняется назначение большинства файлов в кеш-памяти модуля. Некоторые временные файлы (файлы блокировки (lock files), временные каталоги) опускаются. Для каждого пути $module - это путь к модулю, а $version - это версия. Пути, заканчивающиеся косой чертой (/), являются каталогами. Заглавные буквы в путях и версиях модулей экранируются восклицательными знаками (Azure заменяется !azure), чтобы избежать конфликтов в файловых системах без учета регистра.

Путь $module@$version/

Каталог, содержащий извлеченное содержимое .zip файла модуля. Он служит корневым каталогом для загруженного модуля. Он не будет содержать файл go.mod, если его не было в исходном модуле.

Путь cache/download/

Каталог, содержащий файлы, загруженные из прокси-серверов модуля, и файлы, полученные из систем контроля версий. Структура этого каталога соответствует протоколу GOPROXY, поэтому этот каталог может использоваться в качестве прокси-сервера, когда он обслуживается файловым сервером HTTP или когда на него ссылается URL-адрес file://.

Путь cache/download/$module/@v/list

Список известных версий. Это может измениться со временем, поэтому команда go обычно выбирает новую копию вместо того, чтобы повторно использовать этот файл.

Путь cache/download/$module/@v/$version.info

Метаданные JSON о версии. Это может измениться со временем, поэтому команда go обычно выбирает новую копию вместо того, чтобы повторно использовать этот файл.

Путь cache/download/$module/@v/$version.mod

Файл go.mod для этой версии. Если в исходном модуле не было файла go.mod, это синтезированный файл без требований.

Путь cache/download/$module/@v/$version.zip

Заархивированное содержимое модуля.

Путь cache/download/$module/@v/$version.ziphash

Криптографический хеш файлов в .zip файле. Обратите внимание, что сам файл .zip не хешируется, поэтому порядок файлов, сжатие, выравнивание и метаданные не влияют на хеш. При использовании модуля команда go проверяет, соответствует ли этот хеш соответствующей строке в go.sum. Команда go mod verify проверяет соответствие хешей .zip файлов модуля и извлеченных каталогов этим файлам.

Путь cache/download/sumdb/

Каталог, содержащий файлы, загруженные из базы данных контрольных сумм (обычно sum.golang.org).

Путь cache/vcs/

Содержит клонированные репозитории управления версиями для модулей, извлеченных непосредственно из их источников. Имена каталогов представляют собой хеши в шестнадцатеричной кодировке, производные от типа репозитория и URL-адреса. Репозитории оптимизированы по размеру на диске. Например, клонированные репозитории Git по возможности являются пустыми и неглубокими.


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


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

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