go module 名称与 GitHub/Gitlab 地址不同时的引用方式(module declares its path as: github.com/someone/repo )
前言
开源好,开源秒,开源呱呱叫!都知道开源项目好,而在 go
中,使用开源库的最好方式,当前莫过于 module
了。
最近遇到了两个引用错误场景:
- 我在
GitHub
上发现了优秀的开源库,fork
到自己的仓库改了下,希望用到自己的项目中。 - 我本地写了一个特牛的插件(
module
名称是utils
而不是gitlab.com/xxx/utils
),想分享给在座的各位,通常公司内部都会有方便快速开发的公共库,这时需要将该库推送到gitlab
仓库中。
发现使用 module
直接引用仓库都会报错。
module declares its path as: github.com/someone/repo
but was required as: github.com/you/repo
module declares its path as: utils
but was required as: gitlab.com/xxx/utils
当时遇到这个错的第一印象:手动更改代码仓库中的 module name
,然后再将仓库里所有的 github.com/someone/repo
都替换成 github.com/you/repo
。
的确可以解决,但是不够优雅,下面介绍下 mod
的 replace
方案。
解决方案
replace github.com/someone/repo => github.com/you/repo latest
go mod tidy
- 使用时
import github.com/someone/repo
1. replace
module my-project
go 1.20
replace github.com/someone/repo => github.com/you/repo latest
或者通过 go mod
命令行更改
go mod edit -replace="github.com/someone/repo=github.com/you/repo@latest"
github.com/you/repo
后的 latest
是拉取最新的代码,可以更换为指定的 commit id
(12位),例:
replace github.com/someone/repo => github.com/you/repo 123456abcdef
使用 commit id
替换是通用的方式。
2. go mod tidy
replace
过后,需执行 go mod tidy
同步代码仓库。
执行完成后,可以看到 go.mod
的 replace
行后内容改成类似下面的字符串:
# v0.0.0-时间-12位的commit id
v0.0.0-20230715085920-843574e11e36
replace github.com/someone/repo => github.com/you/repo v0.0.0-20230715085920-843574e11e36
3. import
项目真正引用的时候,直接引用 github.com/someone/repo
package main
import r "github.com/someone/repo"
func main() {
r.xxx()
}
其他
如何使用自己搭建的 Gitlab
私有仓库包,可以看我之前写过的这篇 go import package 引用本地搭建的gitlab的私有包。
在使用自己的 Gitlab
仓库时,遇到如下错误:
Cloning into '/root/go/src/gitlab.com/user/extract'...
fatal: could not read Username for 'https://gitlab.com': terminal prompts disabled
package gitlab.com/user/extract: exit status 128
这是因为通过 ssh
方式拉取的项目,需要全局替换。
在 ~/.gitconfig 中添加以下信息
[url "git@gitlab.com:"]
insteadOf = https://gitlab.com/
总结
本篇介绍了 go
引用第三方库时,当 module
名称和引入仓库地址不同的情况下的解决方式:使用 mod
的 replace
特性。使用 replace
将 module name
替换成网站地址即可。