从私有存储库获取依赖项的正确方法

Right way to get dependencies from private repository

我在 http://localhost:7990 clone link http://localhost:7990/scm/gom/bar.git

上有私人 bitbucket 回购

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-project 中使用一个作为依赖项。

https://mod.org/bar 的服务器需要 return go-import 元数据遵循 https://golang.org/cmd/go/#hdr-Remote_import_paths 中描述的协议。

存在多种开源实现,例如:

您可以在 .netrc file, and use the GOPRIVATE 环境变量中存储 HTTPS 服务器和底层存储库的凭据(或访问令牌),以告诉 go 命令不要在public代理。

解决问题的步骤

1️⃣ 将 go.mod 中的模块声明更改为

module mod.org/gomod/bar

go 1.16

bitbucket 存储库结构相同

repo 对克隆的引用:

http://localhost:7990/scm/gomod/bar.git
ssh://git@mod.org/gomod/bar.git

2️⃣更改.gitconfig:添加insteadOfsshhttps

# [url "http://localhost:7990/scm"]
[url "ssh://git@mod.org"]
      insteadOf = https://mod.org

3️⃣ 添加 https://mod.org 到私有仓库

go env -w GOPRIVATE="mod.org"

❗在所有准备工作完成后,该模块将可以通过 version tags

从其他模块 go mod download 访问
module mod.org/gomod/foo

go 1.16

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

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

或手动

go get -u mod.org/gomod/bar.git
go get mod.org/gomod/bar.git@v1.0.0-beta.1

你不能在没有 .git 扩展名的情况下使用私人仓库,因为 go 工具不知道你的私人仓库的版本控制协议,git 或 svn 或任何其他协议。

对于 github.comgolang.org,它们被硬编码到 go 的源代码中。

go 工具将执行 https 查询以了解在获取您的私有存储库之前:

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

如果你的私有仓库不支持https,请使用go模块的replace语法直接告诉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