在 Go 项目中使用从别人那里克隆(Fork)出来的项目

陪她去流浪 桃子 2020年05月24日 编辑 阅读次数:4553

今天从 GitHub 克隆了一个别人的 Golang Markdown 项目,作了些修改,想使用自己的版本,发现不行,因为模块的路径不对,导致导入出错。

原来的模块路径和文件(go.mod):

1
2
3
// github.com/yuin/goldmark
module github.com/yuin/goldmark
go 1.13

克隆后的模块路径和文件:

1
2
3
// github.com/movsb/goldmark
module github.com/yuin/goldmark  
go 1.13

只是路径变了,go.mod 里面的内容是不变的。

同样,代码里面使用的当前项目的子模块的引用路径肯定也没变。这样一定会导致各种引用混乱。所以当前 Go 语言为什么没有引入导入相对路径的模块?🤔

尝试在测试项目里面使用我自己的克隆版本:

1
2
3
4
5
6
7
package main

import "github.com/movsb/goldmark"

func main() {
	goldmark.New()
}

发现会报错:

1
2
3
4
$ go run main.go 
go: github.com/movsb/goldmark: github.com/movsb/goldmark@v1.1.30: parsing go.mod:
        module declares its path as: github.com/yuin/goldmark
                but was required as: github.com/movsb/goldmark

所以,怎么办?不可能把人家的路径全部给改了吧?

突然想到了 replace 指令。

以前为了引入一个在本地正在开发的模块,经常 replace 路径为本地路径:

replace github.com/movsb/taorm => /Users/tao/code/taorm

实际上 replace 也可以用来替换掉非本地的模块路径。

代码里面导入原来的仓库路径:

1
2
3
4
5
6
7
package main

import "github.com/yuin/goldmark"

func main() {
	goldmark.New()
}

go.mod 里面 replace 掉。require 原来的,replace 成自己的:

1
2
3
4
5
6
module github.com/movsb/test

require github.com/yuin/goldmark v1.1.30

replace github.com/yuin/goldmark => github.com/movsb/goldmark v1.1.30
go 1.13

如果要更新版本,可以把 v1.1.30 换成新版本,或者 git 的提交号(commit-id):

1
2
replace github.com/yuin/goldmark => github.com/movsb/goldmark v1.1.30
replace github.com/yuin/goldmark => github.com/movsb/goldmark 32a63fedc159ee3ddbe780783211cdd9b79a052c

如果第二形式编辑器报错,可忽略。然后在终端执行:

1
go mod download github.com/yuin/goldmark // 原始路径

参考:

标签:Go