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

6 回复

感谢您的回复,但为什么需要明确指定版本 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

我仍然不明白你想做什么。你为什么要把模块(package3pacakge4)放到 github.com/viveknangal/aws-utils 里?后面这个模块有标签,如果你想导入它的话可以使用。但是一个模块包含“子模块”?

另外,不要将包命名为 aws-utils。这里的短横线 - 是不合法的。

要使用 github.com/viveknangal/aws-utilsv1.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-utilsv1.3.0 版本。

问题在于你的模块路径不符合Go的语义导入版本控制规则。GitHub仓库 github.com/viveknangal/aws-utils 的tag v1.0.2 没有遵循Go模块的版本命名规范。

根据输出信息,Go工具链找到了两个版本:

  1. v1.0.2 - 这是你在GitHub上打的tag
  2. v0.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文件,你需要:

  1. github.com/viveknangal/aws-utils 仓库根目录创建go.mod文件:
// 在aws-utils仓库根目录的go.mod
module github.com/viveknangal/aws-utils

go 1.15
  1. 然后重新打tag(比如 v1.0.3

  2. 在你的项目中更新依赖:

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
回到顶部