Правильный способ получить зависимости из частного репозитория

У меня есть личное bitbucket репо на http://localhost:7990 => клонировать ссылкуhttp://localhost:7990/scm/gom/bar.git

go.mod выглядит как:

module mod.org/bar

go 1.13

Ссылки, доступные в удаленном репозитории:

git ls-remote  http://localhost:7990/scm/gom/bar.git 

From http://localhost:7990/scm/gom/bar.git
d456de4f12785b26ac27ba08cffb76687d1287c8        HEAD
d456de4f12785b26ac27ba08cffb76687d1287c8        refs/heads/master
f948bd47a22c5fb9abed5bff468a10fc24f67483        refs/tags/v1.0.0

Я изменился .gitconfig к

[url "http://localhost:7990/scm/gom"]
      insteadOf = https://mod.org

и попытался получить модуль name, получить no such host ошибка:

go get -v mod.org/bar

go get lmod.org/bar: unrecognized import path "lmod.org/bar" (https fetch: Get https://lmod.org/bar?go-get=1: dial tcp: lookup lmod.org: no such host)

Когда я добавляю расширение .git

go get -v mod.org/bar.git 

go: finding lmod.org/bar.git v1.0.0
go: downloading lmod.org/bar.git v1.0.0
verifying lmod.org/bar.git@v1.0.0: lmod.org/bar.git@v1.0.0: reading https://sum.golang.org/lookup/lmod.org/bar.git@v1.0.0: 410 Gone

go скачать версию с тегом v1.0.0 к GOPATH = /Users/user/go":

$GOPATH
└── go
     └── pkg
         └── mod
             └── cache
                 └── download
                     └── mod.org
                         └── bar.git
                             └── @v
                                 ├── v1.0.0.info
                                 ├── v1.0.0.lock
                                 └── v1.0.0.zip.tmp882433775

, но я все еще не могу использовать его как зависимость в другом go-проекте.

2 ответа

Решение

Сервер для https://mod.org/bar нужно вернуться go-importметаданные в соответствии с протоколом, описанным в https://golang.org/cmd/go/.

Существует несколько реализаций с открытым исходным кодом, таких как:

Вы можете хранить учетные данные (или токены доступа) как для HTTPS-сервера, так и для базового репозитория в .netrc файл и используйте GOPRIVATE переменная среды, чтобы сообщить go команда не искать ваше частное репо в публичном прокси.

Вы не можете использовать частное репо без .git extension из-за того, что инструменты go не знают протокол управления версиями вашего частного репо, git, svn или любого другого.

За github.com или же golang.org они жестко запрограммированы в исходный код go.

Инструмент go сделает https запрос, чтобы узнать, что перед получением вашего частного репо:

https://private/user/repo?go-get=1

Если ваше частное репо не поддерживает https, пожалуйста, используйте replace синтаксис модуля go для прямого указания инструментов go:

require private/user/repo v1.0.0

...

replace private/user/repo => private.server/user/repo.git v1.0.0

https://golang.org/cmd/go/#hdr-Remote_import_paths

Шаги по решению проблемы:

  1. изменено объявление модуля в go.mod к

    module mod.org/gom/bar
    
    go 1.13
    

    такой же как bitbucket структура репозиториев

    ссылки репо на клонирование:

    http://localhost:7990/scm/gom/bar.git
    ssh://git@mod.org/gom/bar.git
    
  2. изменение .gitconfig: Добавить insteadOf (ssh или https)

    # [url "http://localhost:7990/scm"]
    [url "ssh://git@mod.org"]
          insteadOf = https://mod.org
    
  3. Добавить https://mod.org в частный репозиторий

    go env -w GOPRIVATE="mod.org"
    

После всех приготовлений модуль будет доступен для go mod download из другого модуля version tags

module mod.org/gom/foo

go 1.13

require (
   mod.org/gom/bar v1.0.0-beta.1
)

replace (
   mod.org/gom/bar => mod.org/gom/bar.git v1.0.0-beta.1
) 

или руководство

go get -u mod.org/gom/bar.git
go get mod.org/gom/bar.git@v1.0.0-beta.1
Другие вопросы по тегам