При скачивании пакета с приватного репозитория используя go get
или go mod tidy
— вы можете получить следующую ошибку:
go: content-api imports
github.com/renakdup/content-api/api: github.com/renakdup/content-api@v0.0.0-20200117130739-0d2a7a38aa7f: verifying module: github.com/renakdup/content-api@v0.0.0-20200117130739-0d2a7a38aa7f: reading https://sum.golang.org/lookup/github.com/!renakdup/content-api@v0.0.0-20200117130739-0d2a7a38aa7f: 404 Not Found
server response:
not found: github.com/renakdup/content-api@v0.0.0-20200117130739-0d2a7a38aa7f: invalid version: git ls-remote -q origin in /tmp/gopath/pkg/mod/cache/vcs/76be6f7021193b6608a771a5dvfdcd585ddb26952bedfaf96954ee1e46cb1b13: exit status 128:
fatal: could not read Username for 'https://github.com': terminal prompts disabled
Confirm the import path was entered correctly.
If this is a private repository, see https://golang.org/doc/faq#git_https for additional information.
Эта ошибка свидетельствует что сервер sum.golang.org проверки хеш-суммы публичного репозитория вернул 404 для искомого модуля.
А так-же мы получили ошибку fatal: could not read Username for 'https://github.com': terminal prompts disabled
, что означает что мы обращаемся по https протоколу вместо ssh. Но это не всегда так.
Давайте погрузимся в детали и решим эту проблему.
Почему так происходит
По умолчанию команда go загружает модули из общедоступного зеркала модулей Go по адресу proxy.golang.org. По умолчанию загруженные модули, независимо от источника, также проверяются по общедоступной базе данных контрольных сумм Go по адресу sum.golang.org.
Эти значения по умолчанию хорошо работают для публичного исходного кода, но не работают для приватных репозиториев.
Решение проблемы с приватным репозиторием
GOPRIVATE
переменная окружения контролирует какие модули будут рассматриваться go
командой как приватные (не доступные публично) и поэтому go
команда не должна использовать прокси-сервер или базу данных контрольных сумм.
Подробнее можете прочитать об этом в официальной документации.
Командаgo env -w
(см.go help env
) может быть использована для установки этих переменных для последующих вызовов командыgo
.
Переменная представляет собой список glob-шаблонов (в синтаксисе path.Match
команды Go) префиксов путей к модулям, разделенных запятыми. Например:
go env -w GOPRIVATE=*.corp.example.com,rsc.io/private
заставляет команду go
считать приватным любой модуль с префиксом пути, соответствующим любому из шаблонов, включая git.corp.example.com/xyzzy, rsc.io/private и rsc.io/private/quux.
Если вы хотите разрешить все приватные репозитории из вашей организации
go env -w GOPRIVATE=github.com/<OrgNameHere>/*
Почему «go get» использует HTTPS при клонировании репозитория?
Компании часто разрешают исходящий трафик только на стандартных TCP-портах 80 (HTTP) и 443 (HTTPS), блокируя исходящий трафик на других портах, включая TCP-порт 9418 (git) и TCP-порт 22 (SSH). При использовании HTTPS вместо HTTP git
по умолчанию применяется проверка сертификата, обеспечивая защиту от атак «man-in-the-middle», подслушивания и подделки. Поэтому команда go get
использует HTTPS в целях безопасности.
Git можно настроить для аутентификации по протоколу HTTPS или для использования SSH вместо HTTPS. Для аутентификации по протоколу HTTPS вы можете добавить строку в файл $HOME/.netrc, к которому обращается git:
machine github.com login USERNAME password APIKEY
Для учетных записей GitHub паролем может быть личный токен доступа.
Git также можно настроить на использование SSH вместо HTTPS для URL-адресов (Я настоятельно рекомендую это сделать), соответствующих заданному префиксу.
Чтобы использовать SSH для всего доступа к GitHub, добавьте эти строки в свой ~/.gitconfig
:
[url "ssh://git@github.com/"]
insteadOf = https://github.com/
Полезные ссылки
- About private modules (Официальная документация)
- Why does «go get» use HTTPS when cloning a repository? (Официальная документация)