以前也寫過Go項(xiàng)目肠鲫,感覺最不爽的就是項(xiàng)目要依賴GOPATH,特別是從github clone的項(xiàng)目榜轿,有的時(shí)候還需要改其import路徑才能跑起來幽歼,真的是很不爽。
使用go mod 管理項(xiàng)目谬盐,就不需要非得把項(xiàng)目放到GOPATH指定目錄下甸私,你可以在你磁盤的任何位置新建一個(gè)項(xiàng)目,import可以做到相對獨(dú)立飞傀,如果github上的項(xiàng)目也是用go mod來管理建立的皇型,那么clone到本地可以做到不用改任何東西來運(yùn)行項(xiàng)目。
go mod可以通過require來引用項(xiàng)目以來的其他模塊助析,類似如下格式
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
)
使用中發(fā)現(xiàn)犀被,也可以配置go mod項(xiàng)目自引用,如下是我創(chuàng)建的項(xiàng)目的結(jié)構(gòu)目錄:
工程項(xiàng)目暫時(shí)包含兩個(gè)package:fetch和fetchers外冀,在fetchers中引用了fetch包中的數(shù)據(jù)結(jié)構(gòu),如下是使用相對路徑import的
package fetchers
import "../fetch"
goland ide并沒有報(bào)錯(cuò)掀泳,然鵝build報(bào)錯(cuò)了......
$ go build
build market-data-fetcher: cannot find module for path _/Users/liuyihao/Documents/GitHub/market-data-fetcher/fetch
仔細(xì)一想雪隧,使用../這種相對路徑來import也不優(yōu)雅,于是尋找其他方案员舵。發(fā)現(xiàn)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
這個(gè)版本號(hào)是怎么來的马僻,默認(rèn)寫latest
就行庄拇,go build會(huì)自動(dòng)修正為這個(gè)長串版本號(hào)。
但是到這個(gè)步驟還是會(huì)有問題,因?yàn)間o.mod雖然引用了自己措近,但是實(shí)際上是通過將遠(yuǎn)程git目錄下載到本地來import引用的溶弟,所以如果本地添加了新的package而沒有push到遠(yuǎn)程目錄,引用也是無效的瞭郑。而且還有個(gè)問題就是你修改了某個(gè)包的內(nèi)容辜御,想要引用就必須先push到遠(yuǎn)程git,然后更新才可以屈张,會(huì)給調(diào)試帶來巨大的不便擒权。如下圖,本地雖然引用了遠(yuǎn)程的自己阁谆,但是遠(yuǎn)程目錄還沒有push相關(guān)的package碳抄。
解決方案就是使用go mod的replace指令來使項(xiàng)目引用本地真正的自己,即不是遠(yuǎn)程git也不是本地下載的遠(yuǎn)程git鏡像场绿。
module market-data-fetcher
go 1.12
require github.com/liuhaoeee/market-data-fetcher v0.0.0-20190727134117-607096f6195c
# 這里是重點(diǎn)纳鼎,即項(xiàng)目中"github.com/liuhaoeee/market-data-fetcher"相關(guān)引用路徑會(huì)替換成項(xiàng)目根路徑
replace github.com/liuhaoeee/market-data-fetcher => ./
然后就可以正常import了:
package fetchers
import "github.com/liuhaoeee/market-data-fetcher/fetch"
這個(gè)時(shí)候你可能還會(huì)發(fā)現(xiàn),項(xiàng)目可以正常build裳凸,但是goland ide里確還會(huì)報(bào)錯(cuò)
這是因?yàn)槟愕膅oland還沒有配置打開使用go mod包管理器贱鄙,導(dǎo)致goland不能使用go.mod配置文件。打開就好了
至此就可以盡情的寫代碼了姨谷。