Почему "go vendor add" не работает с номером ревизии

Я получал ошибку компиляции, из-за которой я поверил, что у меня неверная версия библиотеки в папке поставщика. Первой задачей было определить, какая версия библиотеки была правильной. Мне нужно было найти версию источника библиотеки, которая содержала строку "VolumeCreateRequest". Для этого я использовал этот трюк из корневой папки библиотеки:

git rev-list --all | xargs git grep VolumeCreateRequest

Из этого я нашел хэш версии: 06f160237426e705ed214a4f087d4aeea32c0a8b:

Итак, я попытался добавить эту версию в папку моего поставщика go vendor add github.com/docker/docker/...@06f160237426e705ed214a4f087d4aeea32c0a8b

Но это не работает. Когда я проверяю версию библиотеки с помощью git, она не сообщает о версии, которую я только что загрузил.

git log -n 1 --pretty=format:"%H"

Файл vendor.json также содержит неверную версию

Ну что, как поживаешь? После внимательного прочтения документации я вижу, что go vender add просто молча игнорирует @06f160237426e705ed214a4f087d4aeea32c0a8b в конце моего извлечения URI.

Правильная команда - это go vendor fetch, которая поддерживает @version

govendor fetch github.com/docker/docker/...@06f160237426e705ed214a4f087d4aeea32c0a8b

Другой способ сделать это состоит в том, чтобы сделать git checkout той версией библиотеки, которая вам нужна, в вашей GOPATH (т.е. не в папке вашего поставщика), а затем govendor add пакет из вашей ГОПАТЫ

Так что теперь я проверяю версию git, и мы все в порядке. Затем возникла следующая проблема. Наш файл generate.go (вызывается go generate) заходит и перезаписывает нужную версию в моем vendor.json с тем, что было на моем GOPATH.

Последовательность в нашем generate.go является:

//go:generate govendor add +external
//go:generate govendor fetch +missing
//go:generate go vendor sync

Это оказалось неправильно, потому что добавление перезаписало бы мои изменения, тогда синхронизация неэффективна, потому что vendor.json уже заражен неверной версией.

Правильная последовательность такова:

//go:generate govendor sync
//go:generate govendor add +external
//go:generate govendor fetch +missing

Таким образом, ваш настроенный vendor.json будет сначала синхронизировать папку vendor с тем, что вам нужно, и только после этого будут загружены внешние и отсутствующие зависимости.

Наконец, несколько зависимостей вообще не компилируются для конкретной платформы. Чтобы вылечить это, я добавляю эти строки в generate.go, чтобы удалить эти сломанные зависимости, после того как я синхронизирую, добавляю, извлекаю

//go:generate govendor remove github.com/docker/docker/runconfig
//go:generate govendor remove github.com/docker/docker/libcontainerd
//go:generate govendor remove github.com/docker/libcompose/test
//go:generate govendor remove github.com/Microsoft/...

0 ответов

Другие вопросы по тегам