以前也写过Go项目,感觉最不爽的就是项目要依赖GOPATH,特别是从github clone的项目,有的时候还需要改其import路径才能跑起来,真的是很不爽。
使用go mod 管理项目,就不需要非得把项目放到GOPATH指定目录下,你可以在你磁盘的任何位置新建一个项目,import可以做到相对独立,如果github上的项目也是用go mod来管理建立的,那么clone到本地可以做到不用改任何东西来运行项目。
go mod可以通过require来引用项目以来的其他模块,类似如下格式
module GoRoomDemo
go 1.12
require (
github.com/gin-gonic/gin v1.3.0
github.com/golang/protobuf v1.3.1 // indirect
github.com/gomodule/redigo v2.0.0+incompatible
)
使用中发现,也可以配置go mod项目自引用,如下是我创建的项目的结构目录:
工程项目暂时包含两个package:fetch和fetchers,在fetchers中引用了fetch包中的数据结构,如下是使用相对路径import的
package fetchers
import "../fetch"
goland ide并没有报错,然鹅build报错了......
$ go build
build market-data-fetcher: cannot find module for path _/Users/liuyihao/Documents/GitHub/market-data-fetcher/fetch
仔细一想,使用../这种相对路径来import也不优雅,于是寻找其他方案。发现go mod可以引用模块自己。如下是go.mod配置文件:
module market-data-fetcher
go 1.12
require github.com/liuhaoeee/market-data-fetcher v0.0.0-00010101000000-000000000000
哈哈,你可能在疑惑v0.0.0-00010101000000-000000000000
这个版本号是怎么来的,默认写latest
就行,go build会自动修正为这个长串版本号。
但是到这个步骤还是会有问题,因为go.mod虽然引用了自己,但是实际上是通过将远程git目录下载到本地来import引用的,所以如果本地添加了新的package而没有push到远程目录,引用也是无效的。而且还有个问题就是你修改了某个包的内容,想要引用就必须先push到远程git,然后更新才可以,会给调试带来巨大的不便。如下图,本地虽然引用了远程的自己,但是远程目录还没有push相关的package。
解决方案就是使用go mod的replace指令来使项目引用本地真正的自己,即不是远程git也不是本地下载的远程git镜像。
module market-data-fetcher
go 1.12
require github.com/liuhaoeee/market-data-fetcher v0.0.0-20190727134117-607096f6195c
# 这里是重点,即项目中"github.com/liuhaoeee/market-data-fetcher"相关引用路径会替换成项目根路径
replace github.com/liuhaoeee/market-data-fetcher => ./
然后就可以正常import了:
package fetchers
import "github.com/liuhaoeee/market-data-fetcher/fetch"
这个时候你可能还会发现,项目可以正常build,但是goland ide里确还会报错
这是因为你的goland还没有配置打开使用go mod包管理器,导致goland不能使用go.mod配置文件。打开就好了
至此就可以尽情的写代码了。