пятница, 29 января 2021 г.

Модули в Golang: суффиксы основной версии

Начиная с основной версии 2, пути к модулям должны иметь суффикс основной версии, например /v2, который соответствует основной версии. Например, если у модуля есть путь example.com/mod в версии v1.0.0, он должен иметь путь example.com/mod/v2 в версии v2.0.0.

Суффиксы основной версии реализуют правило совместимости импорта:

Если старый и новый пакет имеют одинаковый путь импорта, новый пакет должен быть обратно совместим со старым пакетом.

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

Суффиксы основной версии не допускаются в основных версиях v0 или v1. Нет необходимости изменять путь к модулю между v0 и v1, поскольку версии v0 нестабильны и не имеют гарантии совместимости. Кроме того, для большинства модулей v1 имеет обратную совместимость с последней версией v0; версия v1 действует как обязательство по совместимости, а не как указание на несовместимые изменения по сравнению с v0.

Как особый случай, пути модулей, начинающиеся с gopkg.in/, всегда должны иметь суффикс основной версии, даже в v0 и v1. Суффикс должен начинаться с точки, а не с косой черты (например, gopkg.in/yaml.v2).

Суффиксы основной версии позволяют сосуществовать нескольким основным версиям модуля в одной сборке. Это может быть необходимо из-за проблемы с diamond зависимостью. Обычно, если модуль требуется в двух разных версиях из-за транзитивных зависимостей, будет использоваться более высокая версия. Однако, если две версии несовместимы, ни одна из версий не удовлетворит всех клиентов. Поскольку несовместимые версии должны иметь разные основные номера версий, они также должны иметь разные пути к модулям из-за суффиксов основной версии. Это разрешает конфликт: модули с разными суффиксами обрабатываются как отдельные модули, а их пакеты - даже пакеты в одном подкаталоге относительно их корней модулей - различны.

Многие проекты Go выпускали версии v2 или выше без использования суффикса основной версии перед переходом на модули (возможно, до того, как модули были даже введены). Эти версии помечены тегом сборки +incompatible (например, v2.0.0+incompatible).


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


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

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