Модуль, выпущенный в основной версии 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, даже если подкаталог основной версии не использовался.
Читайте также:
- Модули в Golang: выбор минимальной версии (MVS)
- Модули в Golang: совместимость с немодульными репозиториями
- Модули в Golang: +incompatible версии
Комментариев нет:
Отправить комментарий