Go Module 踩坑系列 000

2022/02/25

v0.0.0 版本(伪版本) module 存在的问题

直接 import 的包覆盖了间接引用的同名包。

复现问题

Step 1

创建一个 module ,名叫 demo

mkdir demo
cd demo
go mod init gitlab.com/sko00o/demo

在 demo.go 中提供给一个 Version() 函数

package demo

const version = "0.0.1"

func Version() string {
	return version
}

然后提交的 gitlab 上去

git init
git remote add origin git@gitlab.com:sko00o/demo.git
git add .
git commit -m "Bump version 0.0.1"
git branch -m "main"
git push -u origin main

Step 2

创建一个 Go 项目,名叫 proj

mkdir proj
cd proj
go mod init gitlab.com/sko00o/proj

引用 demo module (我们指定拉取的分支为 main)

❯ go get gitlab.com/sko00o/demo@main
go: downloading gitlab.com/sko00o/demo v0.0.0-20220617073456-1743e7c33602
go get: added gitlab.com/sko00o/demo v0.0.0-20220617073456-1743e7c33602

main.go 添加运行逻辑

package main

import (
	"fmt"

	"gitlab.com/sko00o/demo"
)

func main() {
	fmt.Printf("demo version %s\n", demo.Version())
}

运行一下

❯ go run main.go                                                 
demo version 0.0.1

Step 3

在 proj 项目中提供公有 api ,在 api/api.go 中写入如下代码:

package api

import "gitlab.com/sko00o/demo"

func Version() string {
	return demo.Version()
}

修改 main.go

package main

import (
	"fmt"

	"gitlab.com/sko00o/proj/api"
)

func main() {
	fmt.Printf("api version %s\n", api.Version())
}

运行一下

❯ go run main.go
api version 0.0.1

提交 proj 项目到 gitlab

go mod tidy
git init
git remote add origin git@gitlab.com:sko00o/proj.git
git add .
git commit -m "Bump version 0.0.1"
git branch -m "main"
git push -u origin main

Step 4

创建第二个 Go 项目,名叫 hyproj

mkdir hyproj
cd hyproj
git init
git remote add origin git@gitlab.com:sko00o/hyproj.git
go mod init gitlab.com/sko00o/hyproj

引入之前创建的 proj/api (我们指定拉取的分支为 main)

❯ go get gitlab.com/sko00o/proj/api@main
go get: added gitlab.com/sko00o/demo v0.0.0-20220617073456-1743e7c33602
go get: added gitlab.com/sko00o/proj v0.0.0-20220617080555-93e50ca18c83

main.go 添加运行逻辑

package main

import (
	"fmt"

	"gitlab.com/sko00o/demo"
	"gitlab.com/sko00o/proj/api"
)

func main() {
	fmt.Printf("demo version %s\n", demo.Version())
	fmt.Printf("proj api version %s\n", api.Version())
}

运行一下

❯ go run main.go
demo version 0.0.1
proj api version 0.0.1

至此一切都符合预期。

Step 5

接下来我们回到 demo 项目,修改 demo.go 中的版本号:

package demo

-const version = "0.0.1"
+const version = "0.0.2"

func Version() string {
	return version
}

将最新改动提交到 gitlab

git add demo.go
git commit -m "Bump version 0.0.2"
git push

查看这次提交的 Commit SHA ,此处是 14d67b0b93f485c6874397ac6528a5adae4c0454

然后再次进入 hyproj 项目,拉取 demo module (我们指定拉取的 commit SHA)

❯ go get gitlab.com/sko00o/demo@14d67b0b93f485c6874397ac6528a5adae4c0454 
go get: upgraded gitlab.com/sko00o/demo v0.0.0-20220617073456-1743e7c33602 => v0.0.0-20220617082310-14d67b0b93f4

此处为什么不直接 go get gitlab.com/sko00o/demo@main ?按说应该可以获取到最新的提交,但实际上什么都没发生。为了复现问题,我得指定 commit 拉取。(BTW, 我当前使用的是 Go 1.17.3 。)

再次运行

❯ go run main.go                                                        
demo version 0.0.2
proj api version 0.0.2

问题总结