引用库中的 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
结果并没有改变。
问题总结
- proj 中的 go module replace 并没能在它作为导入项目时起作用。