Как объявить golang версии зависимостей лучше всего в go .mod? - PullRequest
1 голос
/ 25 мая 2020

Классический способ объявления версии зависимости в моде go - через

require (
    k8s.io/api v0.17.4
    k8s.io/apimachinery v0.17.4
    k8s.io/cli-runtime v0.17.0
    k8s.io/client-go v0.17.4
)

В прошлом (go <= 1.12?) Это разрешалось для версий с отметкой времени, но недавно версии остаются нетронутыми. </p>

Тем не менее, я также видел эту технику для вывода версий:

require (
    k8s.io/api v0.17.4
    k8s.io/apimachinery v0.17.4
    k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible
    k8s.io/code-generator v0.18.0
    k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a
)

replace (
    k8s.io/api => k8s.io/api v0.16.4
    k8s.io/client-go => k8s.io/client-go v0.16.4
    k8s.io/code-generator => k8s.io/code-generator v0.16.4
    k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf
)

Вопрос в том, почему лучше выбрать один подход. другой? Требуется ли последнее для разрешения конфликтующих версий, возникающих из транзитивных зависимостей? И если да, то почему бы не добавлять версии только в предложение replace() с самого начала, чтобы быть точным (не только в конфликтном случае)?

1 Ответ

0 голосов
/ 15 июня 2020

Замена полезна, если вы хотите использовать определенную версию зависимости в текущем модуле:

  • Вы можете использовать эту версию, потому что это вилка с необходимыми вам модификациями .

    require example.com/original v1.0.0
    replace example.com/original => github.com/... v1.0.1
    

    (Примечание: вы можете заменить v1.0.1 на master (или другую ветку), и он будет заменен псевдо-версией в следующий раз, когда вы build / test / mod tidy.)

  • По какой-то причине вы не сможете изменить младшие версии этой конкретной зависимости. Возможно, для проверки поведения требуется дополнительное тестирование, или, возможно, вы пробовали более новые версии, но они не работают.

  • Возможно, вы вносите изменения в несколько проектов или у вас есть несколько модулей в единое репо, и вы хотите иметь возможность вносить изменения во все модули одновременно во время разработки.

Чтобы замена была значимой, вы должны быть в зависимости от модуля, который вы заменяете . Вы добавляете зависимости в go.mod, используя require, поэтому вы не можете только использовать replace.

A replace - это дополнительная работа по обслуживанию, и замена всего не нужно вообще. replace следует использовать выборочно, когда это необходимо, как в ситуациях выше.

Наконец, добавление замены не делает выбор версии более «точным». Добавление замены затрудняет обновление зависимости. Человеку, скорее всего, потребуется ввести go и сказать: «Да, мы делаем хотим обновить эту зависимость», вместо того, чтобы позволить Выбор минимальной версии решать, когда обновлять зависимость, что может произойти случайно без человек замечает. Как отмечалось выше, для некоторых проектов это может быть плохо.

...