Хотите знать, как обновить вложенную зависимость, полученную через другую зависимость? Если да, то этот пост для вас!

В GoLang зависимости, перечисленные в вашем файле go.mod, будут зависимостями, используемыми для компиляции двоичного файла. Кроме того, GoLang также получит все косвенные зависимости, исходящие из ваших прямых зависимостей, с любой требуемой версией.

Чтобы заставить GO использовать другую версию для этих косвенных зависимостей, все, что вам нужно сделать, это добавить косвенную зависимость с той версией, которая вам нужна, в файл go.mod вашего пакета.

Разговор дешевый. Покажи мне код - Линус Торвальдс

Хорошо, давайте воспользуемся gjson (сторонняя библиотека https://github.com/tidwall/gjson для парсинга json) в качестве примера, чтобы обновить одну из его косвенных зависимостей.

Начнем с просмотра файла go.mod библиотеки gjson.

https://github.com/tidwall/gjson/blob/master/go.mod

Две косвенные зависимости (Pretty и Match) необходимы для запуска gjson, поэтому давайте посмотрим, какие версии этих косвенных зависимостей используются при создании небольшой программы, использующей gjson(версия 1.9.0):

go.mod:

main.go:

Выход:

&{github.com/tidwall/gjson v1.9.0 h1:+Od7AE26jAaMgVC31cQV/Ope5iKXulNMflrlB7k+F9E= <nil>}
&{github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE= <nil>}
&{github.com/tidwall/pretty v1.1.0 h1:K3hMW5epkdAVwibsQEfR/7Zj0Qgt4DxtNumTq/VloO8= <nil>}

lastname: Prichard

Примечание: если вы запускаете код и видите «не в порядке, попробуйте…», задайте для переменной окружения GO111MODULE пустую строку, используя go env -w GO111MODULE=.

Используя пакет runtime/debug, мы можем распечатать прямые и косвенные зависимости, используемые в двоичном файле, а также их версии и контрольную сумму для обеспечения целостности. Здесь также печатается фамилия, что свидетельствует о том, что gjson работает должным образом. Итак, давайте возьмем косвенную зависимость Pretty в качестве примера и обновим ее до более новой версии (с 1.1.0 до 1.2.0).

  1. Первый шаг — перейти к файлу go.mod и включить Pretty вместе с новой версией и добавить «// косвенный» в конце:

2. Второй шаг — загрузить указанную версию с помощью следующей команды «go mod download github.com/tidwall/pretty», которая будет использовать версию, указанную в go.mod.

3. Последний шаг — собрать и снова запустить бинарный файл:

&{github.com/tidwall/gjson v1.9.0 h1:+Od7AE26jAaMgVC31cQV/Ope5iKXulNMflrlB7k+F9E= <nil>}
&{github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE= <nil>}
&{github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= <nil>}
Prichard

Как видите, теперь Pretty работает в более новой версии.

Я надеюсь, что этот пост поможет всем, кто ломает голову, пытаясь понять, как изменить версию конкретной зависимости. Моя мотивация для написания этой статьи возникла из-за ограничений «go mod graph». Тем не менее, стоит упомянуть, что в GoLang 1.18 грядут многообещающие изменения, которые потенциально улучшат поведение графа, так что с нетерпением ждем этого!