go module 名称与 GitHub/Gitlab 地址不同时的引用方式(module declares its path as: github.com/someone/repo )

前言

开源好,开源秒,开源呱呱叫!都知道开源项目好,而在 go 中,使用开源库的最好方式,当前莫过于 module 了。

最近遇到了两个引用错误场景:

  1. 我在 GitHub 上发现了优秀的开源库,fork 到自己的仓库改了下,希望用到自己的项目中。
  2. 我本地写了一个特牛的插件(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

的确可以解决,但是不够优雅,下面介绍下 modreplace 方案。

解决方案

  1. replace github.com/someone/repo => github.com/you/repo latest
  2. go mod tidy
  3. 使用时 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.modreplace 行后内容改成类似下面的字符串:

# 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 "[email protected]:"]
 insteadOf = https://gitlab.com/

总结

本篇介绍了 go 引用第三方库时,当 module 名称和引入仓库地址不同的情况下的解决方式:使用 modreplace 特性。使用 replacemodule name 替换成网站地址即可。

猜你喜欢

转载自blog.csdn.net/DisMisPres/article/details/134250816