Golang模块的语义导入版本问题解析
Golang模块的语义导入版本问题解析 请指出以下模块代码有什么问题,当我运行“go run”时,它在 go.mod 文件中打印出“v0.0.0-20200905093608-fa27acc19ecf”,尽管我在 GitHub 仓库(github.com/viveknangal/aws-utils/package4)中为其关联了一个 TAG。
恳请帮助,因为我是新手,已经花了6个小时试图找出问题,但未能解决。
////////// main.go //// 文件
package main
import (
"fmt"
"github.com/viveknangal/aws-utils/package4"
)
func main() {
fmt.Println("This is a Package1")
fmt.Println(package4.GetName())
}
////////// go run 命令 //////////
go run main.go
go: finding module for package github.com/viveknangal/aws-utils/package4
go: downloading github.com/viveknangal/aws-utils v1.0.2
go: downloading github.com/viveknangal/aws-utils/package4 v0.0.0-20200905093608-fa27acc19ecf
go: downloading github.com/viveknangal/aws-utils v11.0.0+incompatible
go: found github.com/viveknangal/aws-utils/package4 in github.com/viveknangal/aws-utils/package4 v0.0.0-20200905093608-fa27acc19ecf
////////// go.mod //// 文件
module github.com/viveknangal/awsjack
go 1.15
require github.com/viveknangal/aws-utils/package4 v0.0.0-20200905093608-fa27acc19ecf
更多关于Golang模块的语义导入版本问题解析的实战教程也可以访问 https://www.itying.com/category-94-b0.html
感谢您的回复,但为什么需要明确指定版本 v1.0.2?根据 Go 文档,低于 v2 的版本不需要明确指定版本。请帮助我理解这一点。
更多关于Golang模块的语义导入版本问题解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
package4 v0.0.0-20200905093608-fa27acc19ecf
我仍然遇到同样的问题,go.mod 中的标签没有更新为 v0.0.0-20200905093608-fa27acc19ecf。请告诉我,我在这里遗漏了什么。
“go get” 命令总是下载伪版本,请说明为什么它不下载最新的标签 1.0.0,这个标签存在于该仓库中。真的很困扰……有人请帮忙:-
go get github.com/viveknangal/module
go: downloading github.com/viveknangal/module v0.0.0-20200905133558-25b756fd6ebd
我仍然不明白你想做什么。你为什么要把模块(package3、pacakge4)放到 github.com/viveknangal/aws-utils 里?后面这个模块有标签,如果你想导入它的话可以使用。但是一个模块包含“子模块”?
另外,不要将包命名为 aws-utils。这里的短横线 - 是不合法的。
要使用 github.com/viveknangal/aws-utils 的 v1.3.0 版本,可以尝试如下操作:
go.mod:
module github.com/viveknangal/awsjack
go 1.15
require github.com/viveknangal/aws-utils v1.3.0
main.go:
package main
import (
"fmt"
package4 "github.com/viveknangal/aws-utils"
)
func main() {
fmt.Println("This is a Package1")
fmt.Println(package4.GetName())
}
执行 go get 命令会打印以下信息:
$ go get
go: downloading github.com/viveknangal/aws-utils v1.3.0
# github.com/viveknangal/aws-utils
/Users/lutz/go/pkg/mod/github.com/viveknangal/aws-utils@v1.3.0/aws-utils.go:1:12: syntax error: unexpected -, expecting semicolon or newline
该模块存在一个错误,但如果我理解正确的话,这正是你想要的:使用 github.com/viveknangal/aws-utils 的 v1.3.0 版本。
问题在于你的模块路径不符合Go的语义导入版本控制规则。GitHub仓库 github.com/viveknangal/aws-utils 的tag v1.0.2 没有遵循Go模块的版本命名规范。
根据输出信息,Go工具链找到了两个版本:
v1.0.2- 这是你在GitHub上打的tagv0.0.0-20200905093608-fa27acc19ecf- 这是Go自动生成的伪版本
问题出现在你的模块声明上。查看你的 go.mod 文件,模块路径应该是完整的仓库路径,而不是子包路径。
正确的做法应该是:
// go.mod 文件应该这样写
module github.com/viveknangal/awsjack
go 1.15
require github.com/viveknangal/aws-utils v1.0.2
然后在main.go中导入:
package main
import (
"fmt"
"github.com/viveknangal/aws-utils/package4"
)
func main() {
fmt.Println("This is a Package1")
fmt.Println(package4.GetName())
}
但是,这里还有一个关键问题:如果你的 github.com/viveknangal/aws-utils 仓库本身没有正确的 go.mod 文件,Go工具链就无法识别它的版本。
检查远程仓库是否有正确的go.mod文件:
# 查看远程仓库的go.mod文件
curl -s https://raw.githubusercontent.com/viveknangal/aws-utils/v1.0.2/go.mod
如果远程仓库没有go.mod文件,你需要:
- 在
github.com/viveknangal/aws-utils仓库根目录创建go.mod文件:
// 在aws-utils仓库根目录的go.mod
module github.com/viveknangal/aws-utils
go 1.15
-
然后重新打tag(比如
v1.0.3) -
在你的项目中更新依赖:
go get github.com/viveknangal/aws-utils@v1.0.3
如果仓库已经有go.mod文件但路径不正确,也会导致这个问题。确保go.mod中的模块声明与仓库路径完全匹配。
对于已经存在的问题,你可以强制使用特定版本:
# 清理模块缓存
go clean -modcache
# 指定使用v1.0.2版本
go get github.com/viveknangal/aws-utils@v1.0.2
如果问题仍然存在,检查tag是否真的指向了正确的commit:
# 查看tag对应的commit
git ls-remote --tags https://github.com/viveknangal/aws-utils | grep v1.0.2

