Как выполнить "go get" или "go mod tidy" для приватного репозитория

Как выполнить «go get» или «go mod tidy» для приватного репозитория

При скачивании пакета с приватного репозитория используя 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/

Полезные ссылки

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *