Как стать автором
Поиск
Написать публикацию
Обновить

Ошибка «no secure protocol found for repository» или зачем нужен go mod vendor

Уровень сложностиПростой

Привет, Habr! Недавно устроился на новую работу, и снова пришлось настраивать окружение, поднимать локально сервис и делать прочую рутину. Всё бы ничего, НО — наступив на те же грабли, я забыл про существование go mod vendor и убил почти час, пытаясь понять, почему контейнеры не подтягивают зависимости.

Решения в интернете быстро не нашёл, поэтому решил поделиться им здесь — возможно, кому-то сэкономит время.

TL;DR

Чтобы решить данную проблему, достаточно всего пары строк:

В консоли в директории, где находится go.mod

go mod vendor

Теперь можете собирать образ (только не забудьте скопировать ВСЕ файлы из проекта в образ)

Суть ошибки

go mod download
go: gitlab.services.company/private.git/project.ru@v1.0.3: no secure protocol found for repository

Такая ошибка может появляться, когда Go пытается скачать зависимости из git‑репозитория без HTTPS или SSH (в основном это репозитории из внутреннего контура). В случае vendor эта проблема уходит, так как зависимости уже на месте.

Что такое vendor

Когда вы имеете дело с модулями в Go, компилятор обычно извлекает все необходимые модули из их онлайн‑источников/репозиториев и сохраняет их в локальном кэше. Этот кэш находится по пути $GOPATH/pkg/mod или по значению переменной окружения GOMODCACHE.

Этот механизм удобен, но есть нюансы. Если:

то вы получите ошибку при сборке.

Вот здесь и приходит на помощь вендоринг (если у вас не настроен GOPROXY). Команда go mod vendor создаёт в вашем проекте директорию vendor, куда складываются все зависимости. Таким образом, проект становится полностью самодостаточным и не зависит от внешнего интернета. На уровне кода вы продолжаете импортировать пакеты как обычно, но Go теперь будет искать их внутри vendor.

Важно помнить, что как только в проекте появляется папка vendor, Go будет ожидать, что все зависимости синхронизированы с go.mod. И пока этого не произойдёт — сборка завершится ошибкой.

Использование vendor — это способ повысить надёжность проекта и защититься от неприятностей, когда внешние источники оказываются недоступны

Приоритизация источников зависимости
Приоритизация источников зависимости

Заключение

Если вы работаете с Go в контейнерах или изолированных окружениях, не забывайте про go mod vendor. Эта команда может избавить вас от множества проблем, особенно когда доступ к внешним репозиториям ограничен или нестабилен. Создав папку vendor, вы локализуете все зависимости проекта и избавляетесь от неожиданностей при сборке.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.