Go Module 踩坑系列 001

2022/06/17

引用库中的 replace 没有生效

如果发现开源项目有 bug ,我们一般会考虑 fork 项目修改后并提交 PR 。 但是 PR 还没有 merge 之前,如果我们需要用到修正后的版本,可以暂时使用 go.mod 中添加 replace 规则实现。

基于上面已经提交的 demo 仓库,我们能直接从 gitlab 上 fork 一份到 demo-fork 仓库。

复现问题

Step 1

拉取 demo-fork

git clone git@gitlab.com:sko00o/demo-fork.git

修改 demo.go

package demo

-const version = "0.0.2"
+const version = "0.0.2-fixed"

func Version() string {
	return version
}

提交到 fixed 分支

git checkout -b fixed
git add demo.go
git commit -m "Fix the version"
git push -u origin fixed

Step 2

修改 proj 以引用 folk 版本。

在修改前,运行一次:

❯ go run main.go          
api version 0.0.1

接着修改 go.mod ,使用 go mod 命令修改:

❯ go mod edit -replace="gitlab.com/sko00o/demo=gitlab.com/sko00o/demo-fork@fixed"
❯ go mod tidy
go: downloading gitlab.com/sko00o/demo-fork v0.0.0-20220617093215-a81b1acbb872

对比 go.mod 的差异:

diff --git a/go.mod b/go.mod
index 7546315..b0d530a 100644
--- a/go.mod
+++ b/go.mod
@@ -3,3 +3,5 @@ module gitlab.com/sko00o/proj
 go 1.17
 
 require gitlab.com/sko00o/demo v0.0.0-20220617073456-1743e7c33602
+
+replace gitlab.com/sko00o/demo => gitlab.com/sko00o/demo-fork v0.0.0-20220617093215-a81b1acbb872

再次运行:

❯ go run main.go 
api version 0.0.2-fixed

至此都符合预期。

Step 3

将修改后的 proj 提交:

git add .
git commit -m "fix demo version"
git push

查看这次提交的 Commit SHA ,此处是 5018640cf87ca05265bd571823307312b59302b5

新建项目 fxproj

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

导入 proj

❯ go get gitlab.com/sko00o/proj/api@5018640cf87ca05265bd571823307312b59302b5
go: downloading gitlab.com/sko00o/proj v0.0.0-20220617095304-5018640cf87c
go get: added gitlab.com/sko00o/demo v0.0.0-20220617073456-1743e7c33602
go get: added gitlab.com/sko00o/proj v0.0.0-20220617095304-5018640cf87c

编写 main.go

package main

import (
	"fmt"

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

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

运行

❯ go run main.go                                                            
proj api version 0.0.1

能发现 proj 项目中添加的 replace 规则没能起作用。

Step 4

如果是 proj 打了 tag 版本呢?

为当前修改过的 proj 打上 tag

cd proj
git tag v0.0.2
git push origin v0.0.2

回到 fxproj 导入 proj:v0.0.2

❯ go get gitlab.com/sko00o/proj/api@v0.0.2                                  
go: downloading gitlab.com/sko00o/proj v0.0.2
go get: upgraded gitlab.com/sko00o/proj v0.0.0-20220617095304-5018640cf87c => v0.0.2

再次运行

❯ go mod tidy
❯ go run main.go
proj api version 0.0.1

结果并没有改变。

问题总结