Golang模块使用问题求助

Golang模块使用问题求助 我的团队过去一年一直在使用Go语言开发Kubernetes操作器。和其他团队一样,我们在go模块方面也没少遇到挫折。长话短说,我们目前使用的是Go 1.12版本和go模块。(这是我们在CI/CD、IDE等方面能达到的最佳兼容状态)

我很好奇大家是如何处理这类简单问题的。

我正在用Go开发一个应用程序,同时也在编写该应用程序将要使用的一个工具库。

因此,在我的应用程序中:

import "github.mycompany.com/myuser/somerepo/mylibrary"

我完成了一些工作,将更改提交到我的库中,推送并合并。

回到我的应用程序中,我编写了一些代码来使用库中的新更改,然后执行了全新的"go mod download"命令,尝试编译应用程序,但它没有识别出库中的更改。

于是我彻底清除了go缓存(rm -rf ~/go/pkg)。再次执行"go mod download",确认我的库已下载。

问题依旧存在。

有人能帮我理解Go模块如何与Git交互吗?相关文档简直糟糕透顶。

大家是如何处理这种情况的?这模块管理设计真让人沮丧。


更多关于Golang模块使用问题求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

模块会将您的依赖锁定到特定的提交哈希,据我回忆,这些信息记录在 go.sum 文件中。

您可以通过删除该文件或移除相关依赖项对应的行来进行更新。此外,可能还有一个命令可以解除当前已锁定的依赖项。

func main() {
    fmt.Println("hello world")
}

更多关于Golang模块使用问题求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个很常见的Go模块使用问题,主要原因是Go模块系统对版本管理的设计方式。问题不在于Git交互,而在于Go模块的版本解析机制。

当你的应用程序依赖github.mycompany.com/myuser/somerepo/mylibrary时,Go模块会查找该库的最新发布版本标签,而不是主分支的最新提交。

解决方案:

  1. 为你的库打上新的版本标签
# 在你的库仓库中
git tag v1.2.3
git push origin v1.2.3
  1. 或者在应用程序中强制使用最新提交 在你的应用程序的go.mod文件中:
module myapp

go 1.12

require (
    github.mycompany.com/myuser/somerepo/mylibrary v0.0.0-20230115012345-abcdef123456
)

要获取正确的伪版本,运行:

go get github.mycompany.com/myuser/somerepo/mylibrary@master
  1. 使用replace指令进行本地开发 在应用程序的go.mod中添加:
replace github.mycompany.com/myuser/somerepo/mylibrary => ../path/to/local/mylibrary

示例演示:

假设你的库结构:

# 库目录
~/projects/mylibrary/
├── go.mod
└── mylib.go

# 应用程序目录  
~/projects/myapp/
├── go.mod
└── main.go

在应用程序的go.mod中使用replace:

module myapp

go 1.12

require (
    github.mycompany.com/myuser/somerepo/mylibrary v1.0.0
)

replace github.mycompany.com/myuser/somerepo/mylibrary => ../mylibrary

这样,应用程序会直接使用本地库的代码,无需每次提交和拉取。完成开发后,移除replace指令,为库打上新标签,然后更新应用程序的依赖版本。

这种设计虽然初期有些令人困惑,但确保了构建的可重现性。

回到顶部