从私有存储库获取依赖项的正确方法
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
:添加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"
❗在所有准备工作完成后,该模块将可以通过 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.com
或 golang.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
我在 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
:添加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"
❗在所有准备工作完成后,该模块将可以通过 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.com
或 golang.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