вторник, 9 марта 2021 г.

Модули в Golang: zip файлы модулей

Версии модуля распространяются в виде .zip файлов. Прямое взаимодействие с этими файлами возникает редко, поскольку команда go автоматически создает, загружает и извлекает их из прокси-серверов модулей и репозиториев системы управления версиями. Однако по-прежнему полезно знать об этих файлах, чтобы понять ограничения межплатформенной совместимости или при реализации прокси-сервера модуля.

Команда go mod download загружает zip-файлы для одного или нескольких модулей, а затем извлекает эти файлы в кеш модуля. В зависимости от GOPROXY и других переменных среды команда go может загружать zip-файлы с прокси-сервера или клонировать репозитории системы управления версиями и создавать из них zip-файлы. Флаг -json может использоваться для поиска местоположения загружаемых zip-файлов и их извлеченного содержимого в кеш-памяти модуля.

Пакет golang.org/x/mod/zip может использоваться для программного создания, извлечения или проверки содержимого zip-файлов.

Путь к файлу и ограничения размера

На содержимое zip-файлов модуля существует ряд ограничений. Эти ограничения обеспечивают безопасное и единообразное извлечение zip-файлов на самых разных платформах.

  • Размер zip-файла модуля может быть не более 500 Мбайт. Общий размер несжатых файлов также ограничен 500 МБ. Размер файлов go.mod ограничен 16 МБ. Размер файлов LICENSE также ограничен 16 МБ. Эти ограничения существуют для смягчения атак типа "отказ в обслуживании" на пользователей, прокси-серверы и другие части экосистемы модулей. Репозитории, содержащие более 500 МБ файлов в дереве каталогов модуля, должны помечать версии модуля при коммитах, которые включают только файлы, необходимые для сборки пакетов модуля; видео, модели и другие крупные ресурсы обычно не нужны для сборок.
  • Каждый файл в zip-файле модуля должен начинаться с префикса $module@$version/, где $module - это путь к модулю, а $version - это версия, например, golang.org/x/mod@v0.3.0/. Путь к модулю должен быть действительным, версия должна быть действительной и канонической, версия должна соответствовать суффиксу основной версии пути к модулю.
  • Режимы файлов, отметки времени и другие метаданные игнорируются.
  • Пустые каталоги (записи с путями, заканчивающимися косой чертой) могут быть включены в zip-файлы модуля, но не извлекаются. Команда go не включает пустые каталоги в создаваемые ею zip-файлы.
  • Символьные ссылки и другие нестандартные файлы игнорируются при создании zip-файлов, поскольку они не переносятся между операционными системами и файловыми системами, и нет переносимого способа представления их в формате zip-файла.
  • Никакие два файла в zip-файле не могут иметь одинаковые пути при свертывании регистра Unicode. Это гарантирует, что zip-файлы могут быть извлечены в файловых системах без учета регистра без конфликтов.
  • Файл go.mod может появляться или не появляться в каталоге верхнего уровня ($module@$version/go.mod). Если он присутствует, он должен иметь имя go.mod (все в нижнем регистре). Файлы с именем go.mod не разрешены в других каталогах.
  • Имена файлов и каталогов в модуле могут состоять из букв Unicode, цифр ASCII, символа пробела ASCII (U+0020) и знаков пунктуации ASCII !#$%&()+,-.=@[]^_{}~. Обратите внимание, что пути к пакетам не могут содержать все эти символы.
  • Имя файла или каталога до первой точки не должно быть зарезервированным именем файла в Windows, независимо от регистра (CON, com1, NuL и т. д.).

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


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

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