четверг, 11 февраля 2021 г.

Модули в Golang: минимальная совместимость модулей

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

Обычно в режиме GOPATH пакет хранится в каталоге, соответствующем корневому пути его репозитория, соединенному с его директорией в репозитории. Например, пакет в репозитории с корневым путем example.com/repo в подкаталоге sub будет храниться в $GOPATH/src/example.com/repo/sub и будет импортирован как example.com/repo/sub.

Для модуля с суффиксом основной версии можно ожидать найти пакет example.com/repo/v2/sub в каталоге $GOPATH/src/example.com/repo/v2/sub. Это потребует разработки модуля в подкаталоге v2 его репозитория. Команда go поддерживает это, но не требует этого.

Если модуль разрабатывается не в подкаталоге основной версии, то его каталог в GOPATH не будет содержать суффикс основной версии, и его пакеты могут быть импортированы без суффикса основной версии. В приведенном выше примере пакет будет находиться в каталоге $GOPATH/src/example.com/repo/sub и будет импортирован как example.com/repo/sub.

Это создает проблему для пакетов, предназначенных для создания как в модульном режиме, так и в режиме GOPATH: режим модуля требует суффикса, а режим GOPATH - нет.

Чтобы исправить это, минимальная совместимость модулей была добавлена в Go 1.11 и была перенесена в Go 1.9.7 и 1.10.3. Когда путь импорта разрешается в каталог в режиме GOPATH:

  • При разрешении импорта формы $modpath/$vn/$dir, где:
    • $modpath - допустимый путь к модулю,
    • $vn - суффикс основной версии,
    • $dir - возможно, пустой подкаталог,
  • Если все следующее верно:
    • Пакет $modpath/$vn/$dir отсутствует ни в одном соответствующем каталоге поставщика (vendor directory).
    • Файл go.mod находится в том же каталоге, что и файл импорта, или в любом родительском каталоге до корня $GOPATH/src,
    • Каталог $GOPATH[i]/src/$modpath/$vn/$suffix не существует (для любого корневого $GOPATH[i]),
    • Файл $GOPATH[d]/src/$modpath/go.mod существует (для некоторого корня $GOPATH[d]) и объявляет путь модуля как $modpath/$vn,
  • Затем импорт $modpath/$vn/$dir разрешается в каталог $GOPATH[d]/src/$modpath/$dir.

Эти правила позволяют пакетам, которые были перенесены в модули, импортировать другие пакеты, которые были перенесены в модули при сборке в режиме GOPATH, даже если подкаталог основной версии не использовался.


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


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

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