Обновление ссылок на импорт модуля go после обновления основных зависимостей - PullRequest
1 голос
/ 11 марта 2019

Сценарий: мне нужно обновить сторонний Go-модуль до новой основной версии через репозиторий.

Пример: github.com/google/go-github/v20 до github.com/google/go-github/v24

После обновления go.mod иgo.sum, как я могу программно обновить все операторы import в хранилище, чтобы они соответствовали?

Вот простой подход, который не защищен от ошибок:

find *.go -type f -print0 | xargs -0 sed -i '' 's/"github.com\/google\/go-github\/v20/"github.com\/google\/go-github\/v24/g'

Это будет перехватывать все строковые экземпляры, а не только внутри import (хотя это не обязательно плохо).Но я волнуюсь в тех случаях, когда обновление может быть от github.com/abc/def до github.com/abc/dev/v2, потому что там также может быть, например, модуль с именем github.com/abc/def-core.

Обратите внимание, что этот вопрос также не предназначен для захвата«у вас могут быть критические изменения и вам необходимо обновить код» yada yada - это отдельная тема, о которой здесь не спрашивают.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Хорошее автоматизированное решение - https://github.com/marwan-at-work/mod,, которое может автоматически добавлять, удалять или изменять необходимые /vN в вашем *.go коде и вашем go.mod.

Используя ваш пример, он сможет обновить ваш код с помощью github.com/google/go-github/v20, чтобы вместо него использовать github.com/google/go-github/v24.

Из хранилища:

Мотивация

Для этого есть два хороших варианта использования:

  1. Если у вас есть библиотека, и вы хотите внести критические изменения, то вам нужно обойти все файлы Go и подпакеты и обновить пути импорта, чтобы включить v2, v3 и т. д. Этот инструмент просто делает это автоматически одной командой.

  2. Если вы владеете библиотекой, которая уже помечена как v2 или выше, но несовместима с Semantic Import Versioning, тогда этот инструмент может решить проблема для вас с одной командой, а также. Введите файл go.mod с правильным путем импорта, и просто запустите обновление модов один раз или мод -t = X обновить (где x - это самый главный тег), чтобы обновить пути импорта ваших файлов go, чтобы они соответствовали тегу, в котором вы находитесь.

В дополнение к этим двум вариантам использования, эта утилита также относительно недавно добавила поддержку автоматического обновления клиентов для использования другой основной версии модуля путем изменения /vN в клиентском коде *.go и клиентском go.mod ,

Другими словами, эта утилита может использоваться, если вы являетесь автором модуля, переходящего с v2 на v3, и также может использоваться, если вы являетесь пользователем модуля, переходящего с v2 на v3.

Он использует пакеты, такие как golang.org/x/tools/go/ast/astutil, для управления AST источника *.go с целью обновления путей импорта, и, следовательно, не должен быть подвержен типам опасений, которые вы выражали по поводу использования sed.

0 голосов
/ 11 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...