Использование модулей Go с частными репозиториями по HTTP без SSL

Есть ли способ заставить команду go использовать HTTP вместо HTTPS?

Я пытаюсь переместить проект в Go Modules, но этот проект включает частный репозиторий git в качестве зависимости. Этот git репозиторий размещен в частной локальной сети за брандмауэром, и я обычно клонирую его с помощью чего-то вроде cd $GOPATH/git.ourdomain.net/foo/bar/ && git clone http://my-user:[email protected]/foo/bar/reponame.git.

Однако теперь команды go mod, go get и go test пытаются использовать HTTP с SSL (HTTPS).

Этот параметр не помогает:

git config \
  --global \
  url."http://my-user:[email protected]/foo/bar/reponame".insteadOf \
  "http://git.ourdomain.net"

(Здесь можно найти контекст git настроек для частных репозиториев: https://medium.com/cloud-native-the-gathering/go-modules-with-private-git-repositories-dfe795068db4)

Я изменил файл go.mod, чтобы включить ссылку на этот частный репозиторий (с использованием шаблона типа git.ourdomain.net/foo/bar/[email protected]<YYYYMMDDHHmmSS>-<GIT_COMMIT_ID>), но при вызове go test с файлом go.mod, включая это частное репозиторий, я вижу:

go: git.ourdomain.net/foo/bar/[email protected]<YYYYMMDDHHmmSS>-<GIT_COMMIT_ID>: unrecognized import path "git.ourdomain.net/foo/bar/reponame" (https fetch: Get https://git.ourdomain.net/foo/bar/reponame?go-get=1: dial tcp <PUBLIC_IP_ADDRESS>:443: connect: connection refused)

Я также попытался вернуть go.mod к исходной версии (без этого частного репозитория) и попытался go get с пути, где хранится файл go.mod, предполагая, что это каким-то образом обновит go.mod файл через HTTP из-за -insecure (проверьте здесь https://golang.org/cmd/go/#hdr-Module_aware_go_get), например это:

GO111MODULE=on go get -insecure -u git.ourdomain.net/foo/bar/reponame

Но это дало сообщение об ошибке:

fatal: remote error: Repository not found
The requested repository does not exist, or you do not have permission to
access it.

Я знаю, что должен использовать SSL, но у меня никогда не было контроля на этом git сервере, чтобы настроить его так, как он должен быть настроен. Поэтому я просто использовал git clone, предоставляя URL-адрес HTTP (находясь за брандмауэром), и это всегда работало.


person TPPZ    schedule 08.07.2019    source источник
comment
Gitlab предлагает неограниченное количество бесплатных частных репозиториев. Это было бы более функциональное и безопасное решение.   -  person Schwern    schedule 31.07.2019
comment
Хехе, я воспользуюсь этим комментарием, чтобы подтолкнуть GitLab к бюрократии :)   -  person TPPZ    schedule 31.07.2019


Ответы (1)


Команда go начинает выборку заданного пути к модулю, преобразуя этот путь в расположение системы управления версиями. Чтобы разрешить путь, он выдает запрос HTTPS и ищет тег <meta name="go-import" […]>, как описано в https://tip.golang.org/cmd/go/#hdr-Remote_import_paths.

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

Если вы напишете import "git.ourdomain.net/foo/bar/reponame.git" вместо import "git.ourdomain.net/foo/bar/reponame", вы обнаружите, что начальное разрешение HTTPS пропущено, а последующая операция git использует объявление insteadOf из вашей глобальной git конфигурации.

person bcmills    schedule 30.07.2019