Две версии одной и той же зависимости - более низкая версия игнорируется

У меня есть проект, в котором две зависимости используют разные версии одной и той же библиотеки. Например, у моего проекта есть зависимость A и зависимость B. A и B, оба используют общую библиотеку / зависимость X, но разных версий. A имеет v1 версию X и B v2 версию X. Итак, теперь, когда я добавляю A & B в качестве зависимостей в свой проект, в моем проекте go.sum есть 2 версии X.

Я ожидал, что соответствующие версии будут указаны во время выполнения A и B. Но это не так. Каким-то образом, когда я запускаю тесты в своем проекте, A использует v2 из X, в идеале он должен использовать v1 (потому что в go.mod из A явно указано / добавлено v1). Таким образом, выполнение прерывается, потому что есть много различий в v1 и v2 из X.

Итак, как я могу явно указать в моем проекте, что использовать v1 из X по A и использовать v2 по B? Есть ли такое положение в модулях go?


person hemu    schedule 22.08.2019    source источник
comment
Если то, что вы называете v1 и v2, действительно разные основные версии в смысле SemVer (т.е. несовместимы): см. Ответ icza. Если нет: вы обречены, поскольку пакет может существовать в двоичном файле Go только в (не более) 1 основной версии (= тот же путь импорта).   -  person Volker    schedule 22.08.2019


Ответы (1)


Ваш B пакет должен импортировать X с суффиксом /v2.

Go Wiki: Modules: Semantic Import versioning:

Напомним, что semver требует изменения основной версии, когда пакет v1 или выше вносит обратно несовместимое изменение. Результат выполнения как правила совместимости импорта, так и семвера называется Semantic Import Versioning, где основная версия включается в путь импорта - это гарантирует, что путь импорта изменяется каждый раз, когда увеличивается основная версия из-за нарушение совместимости.

В результате управления версиями семантического импорта код, использующий модули Go, должен соответствовать этим правилам:

  • Если версия модуля v2 или выше, основная версия модуля должна быть включена как /vN в конце путей модулей, используемых в файлах go.mod (например, module github.com/my/mod/v2, require github.com/my/mod/v2 v2.0.0) и в пути импорта пакета (например, import "github.com/my/mod/v2/mypkg").

Этот суффикс версии в пути импорта сделает их двумя разными пакетами. Если A и B будут использовать одну и ту же основную версию X, то не будет двух ее версий, будет выбрана более высокая версия (алгоритм выбора минимальной версии). Подробнее см. Выбор версии.

person icza    schedule 22.08.2019
comment
Зависимость, вызывающая проблему, X, не имеет версии / упаковки. Эта зависимость - github.com/pierrec/lz4. В таком случае как с этим справиться? - person hemu; 22.08.2019
comment
@hemu В таком случае у тебя проблемы. Модули Go требуют, чтобы пакеты имели поддержку версий semver2 для правильной работы. Если пакет не соответствует этому, вы должны вручную создать копии пакета с коммитами, которые вы хотите использовать, и использовать эти моментальные снимки. - person icza; 22.08.2019
comment
Да, думаю, ты прав, спасибо @icza за помощь. Технически ваш ответ правильный, если в зависимости используются пакеты. - person hemu; 22.08.2019