Почему "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/...