Golang中V2模块无法正常工作的解决方法

Golang中V2模块无法正常工作的解决方法 我创建了一个包含多个版本的模块:v1.0.0、v1.0.1、v1.1.0 和 v2.0.0。 我创建了一个简单的应用程序来使用这些模块。1.x.x 版本工作正常,但我无法让应用程序使用 v2.0.0 版本。以下是目录结构。

我已经阅读了这篇文章:Go 的主要版本处理很糟糕——来自一个粉丝 | Lane Wagner

我使用的是 Go 1.18。

为什么应用程序使用的是 v1.x.x 版本的模块,而不是 v2.0.0?

// 我发布在 Github 上的模块。
gomath/
├── calc
│   └── calc.go
├── geometry
│   └── cube.go
├── go.mod
├── readme.md
└── v2
    ├── calc
    │   └── calc.go
    ├── geometry
    │   └── cube.go
    └── go.mod
myfirstapp $ cat main.go 
package main

import (
    "fmt"
    "github.com/brandon/gomath/geometry"
    // v2 路径
    "github.com/brandon/gomath/v2/calc"
    // v1 路径
    //"github.com/brandon/gomath/calc"
)

func main() {
    fmt.Println(geometry.CubeVolume(15))

    // v2 模块方法 不工作
    s := calc.Add(4, 5, 6, 7)

    // v1 模块方法 工作
    //s := calc.Add(4, 5)

    fmt.Println(s)
}

v2 模块看起来像这样。

package calc

func Add(args ...int) int {
    sum := 0
    for _, v := range args {
        sum += v
    }
    return sum
}

func Sub(x, y int) int {
    return x - y
}

错误信息显示应用程序仍在使用 1.x.x 版本的模块。

myfirstapp $ go run main.go 
# command-line-arguments
./main.go:16:25: too many arguments in call to calc.Add
        have (number, number, number, number)
        want (int, int)

Go get 可以毫无问题地安装 v2.0.0。

myfirstapp $ ls -l ~/go/pkg/mod/github.com/brandon/gomath/v2@v2.0.0
total 20
dr-x------ 2 brandon brandon 4096 Apr 11 16:20 calc
dr-x------ 2 brandon brandon 4096 Apr 11 16:20 geometry
-r-------- 1 brandon brandon   53 Apr 11 16:20 go.mod
-r-------- 1 brandon brandon    0 Apr 11 16:20 LICENSE
-r-------- 1 brandon brandon   19 Apr 11 16:20 readme.md
dr-x------ 4 brandon brandon 4096 Apr 11 16:20 v2


更多关于Golang中V2模块无法正常工作的解决方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

@brandon

myfirstapp 的 go.mod 文件内容是什么?

更多关于Golang中V2模块无法正常工作的解决方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


brandon:

"github.com/brandon/gomath/geometry"

也许是因为你正在使用 v1 模块中的 geometry 包?

@christophberger go.mod 文件的内容是:

myfirstapp $ cat go.mod 

module myfirstapp
go 1.18
require github.com/brandon/gomath v1.0.0
require github.com/brandon/gomath/v2 v2.0.0 // indirect

问题在于你的 gomath/v2 子目录结构不正确。根据你的目录结构,v2 目录内部又包含了一个 v2 子目录,这导致了 Go 模块系统无法正确识别 v2 模块。

正确的 v2 模块结构应该是:

gomath/
├── calc/
│   └── calc.go
├── geometry/
│   └── cube.go
├── go.mod
├── readme.md
└── v2/
    ├── calc/
    │   └── calc.go
    ├── geometry/
    │   └── cube.go
    └── go.mod

但根据你的 go get 输出,实际结构似乎是:

gomath/v2@v2.0.0/
├── calc/
├── geometry/
├── go.mod
├── LICENSE
├── readme.md
└── v2/  # 这个额外的 v2 目录导致了问题

解决方案:

  1. 修复 v2 模块的目录结构: 确保 v2 目录下没有嵌套的 v2 子目录。你的 v2/go.mod 文件应该包含:
module github.com/brandon/gomath/v2

go 1.18
  1. 清理并重新获取模块
# 清理模块缓存
go clean -modcache

# 删除 go.mod 中的依赖并重新获取
go mod tidy
  1. 检查导入路径: 确保你的应用程序正确导入 v2 版本:
package main

import (
    "fmt"
    "github.com/brandon/gomath/geometry"  // v1
    "github.com/brandon/gomath/v2/calc"   // v2
)

func main() {
    fmt.Println(geometry.CubeVolume(15))  // 使用 v1
    
    s := calc.Add(4, 5, 6, 7)  // 使用 v2 的 Add 函数
    fmt.Println(s)
}
  1. 验证模块版本: 检查你的应用程序的 go.mod 文件:
# 查看依赖版本
go list -m all | grep gomath

# 应该显示类似:
# github.com/brandon/gomath v1.1.0
# github.com/brandon/gomath/v2 v2.0.0
  1. 如果问题仍然存在,强制指定版本
# 强制使用 v2.0.0
go get github.com/brandon/gomath/v2@v2.0.0

关键点是:v2 模块必须位于 v2 目录下,且该目录的结构应该与主模块相同,但不应该包含嵌套的 v2 子目录。Go 模块系统通过 /v2 后缀来识别主要版本,目录结构必须与此匹配。

回到顶部