Golang如何将包发布到GitHub

Golang如何将包发布到GitHub 我编写了一个包,我们称之为 mypkg。它可以在 github.com/myuser/mypkg/ 找到。

包完成后,我执行了以下操作:

  • git tag -a '1.00.00' -m 'version 1.00.00'
  • go mod init github.com/myuser/mypackage
  • git add . && git commit -m 'my commit message'
  • git push --follow-tags origin ← 将标签推送到仓库

这样,包方面的工作就完成了(…我想?)

现在,在可能希望使用 mypkg 的软件项目中,我在该工具的根目录(其 go.mod 文件所在位置)执行以下操作:

  • go get github.com/myuser/mypkg
  • 然后,在每个需要该包的源文件中,我在 import 语句里添加: github.com/myuser/mypkg

问题出在 go get 上:它似乎下载了一个版本 v0.00.00-with_some_hash,而不是 1.00.00

为什么?


更多关于Golang如何将包发布到GitHub的实战教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

你的“go.mod”文件中显示的是哪个版本的包?

更多关于Golang如何将包发布到GitHub的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好,你更新了你的 go.mod 文件吗?你还需要检查一下 GitHub 上标记为发布版本的是哪个版本。

go mod init && go mod tidy。

在 GitHub 这边,我只是给代码打了标签,并没有发布它。我以为打标签就足够了?那这一定是我的问题。

标签必须以 v 开头吗?哦,我错过了这一点。

我正在使用 Jetbrains 的 GoLand,我以为是 IDE 把问题搞复杂了。

今天晚些时候我会再试试,然后告诉你。

jfgratton:

v0.0.0-20240401010128-eac52ef19ef8

可能是因为标签应该是 v*.*.*,尝试更改你的标签并在 mod 文件中显式地修改版本号。

好的……我已经向代码推送了多次更新(文档、一些额外功能等)。

  • git add .
  • git commit -m ‘Extra functions, bla bla bla’
  • git tag -a ‘v1.1.0’, -m ‘my message’
  • git push --follow-tags origin

然后,执行 go mod tidy,在 go.mod 中编辑新版本,再次执行 go mod tidy(是的,我知道这里有冗余步骤),然后……神奇的事情发生了,它成功了。

某种直觉告诉我,github.com、GOLANG 以及很可能还有 Jetbrains 的 GOLAND 之间的整个链接是脆弱的。

我的意思是……我是一个经验丰富的 DevOps 人员,可能在 GO 方面不那么资深,但即便如此……让我挠头直到你能看到挠痕,这对我来说也不是常见的情况。

它没有显示出来 :-/

要发布的包是这样打标签的:git tag -a '1.0.0' -m 'First version'git push --follow-tags origin … 在 GitHub 上,我已经基于那个 1.0.0 标签发布了一个版本。

现在,在应该使用这个工具的工具中,我执行:go get github.com/MYUSER/MYPACKAGE

输出显示如下: go: added github.com/MYUSER/MYPACKAGE v0.0.0-20240401010128-eac52ef19ef8

go.mod 文件中的 require 部分也显示了同样的内容。

就好像 Go 忽略了实际的标签/发布版本。如果我在我的 GOROOT($HOME/go/pkg/mod/github.com/MYUSER/)中检查,MYPKG 显然已经下载到那里了,但带有同样错误的版本号。

相同的问题,我尝试发布另一个不同的包:

GitHub

Release v1.0.0 · jeanfrancoisgratton/helperFunctions

初始版本

你看,发布确实在那里。

我在 go.mod 中添加了以下行: github.com/jeanfrancoisgratton/helperFunctions v1.0.0

然后运行 go mod tidy,接着它报错如下:

github.com/stretchr/testify/assert: github.com/jeanfrancoisgratton/helperFunctions@v1.0.0: verifying go.mod: github.com/jeanfrancoisgratton/helperFunctions@v1.0.0/go.mod: reading https://sum.golang.org/lookup/github.com/jeanfrancoisgratton/helper!functions@v1.0.0: 404 Not Found
        server response: not found: github.com/jeanfrancoisgratton/helperFunctions@v1.0.0: invalid version: unknown revision v1.0.0

这是怎么回事?

你的问题在于Go模块的版本标签格式不符合Go的语义化版本规范。Go要求版本标签必须以小写字母v开头,后面跟随语义化版本号。

你的标签是1.00.00,但Go模块系统期望的是v1.00.00。这就是为什么go get下载了伪版本v0.00.00-with_some_hash

以下是修复步骤:

  1. 删除错误的标签
# 删除本地标签
git tag -d 1.00.00

# 删除远程标签
git push origin :refs/tags/1.00.00
  1. 创建正确的语义化版本标签
# 使用小写v前缀
git tag -a v1.00.00 -m 'version 1.00.00'
  1. 推送正确的标签
# 推送标签到远程仓库
git push origin v1.00.00

# 或者推送所有标签
git push --tags origin
  1. 验证模块版本: 在你的项目中,现在可以正确获取指定版本:
go get github.com/myuser/mypkg@v1.00.00

或者在你的go.mod文件中直接指定:

require github.com/myuser/mypkg v1.00.00
  1. 关于版本号的建议(虽然你要求不要给建议,但这是技术规范):
  • 使用标准的语义化版本格式:v1.0.0 而不是 v1.00.00
  • 对于初始版本,通常使用 v0.1.0v1.0.0

示例正确的标签创建:

# 创建主版本标签
git tag -a v1.0.0 -m 'Initial release'

# 创建次要版本标签
git tag -a v1.1.0 -m 'Add new feature'

# 创建补丁版本标签  
git tag -a v1.1.1 -m 'Fix critical bug'

完成这些步骤后,go get 将能正确识别并下载 v1.00.00 版本。

回到顶部