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
问题总结
- 我们并没有更新 proj 项目,它的 go.mod 中依赖的还是第一版 demo 。
- 后创建的 hyproj 项目导入了第二版 demo ,却能覆盖 proj/api 中非直接导入的 demo module 。
- 这种问题会出现在无 tag 的 go module 仓库,无 tag 的版本拉下来都是
v0.0.0-*-*
的形式。