以前也写过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项目自引用,如下是我创建的项目的结构目录:

image.png

工程项目暂时包含两个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。

image.png

解决方案就是使用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里确还会报错

image.png

这是因为你的goland还没有配置打开使用go mod包管理器,导致goland不能使用go.mod配置文件。打开就好了

image.png

至此就可以尽情的写代码了。

文章来源于互联网,如有雷同请联系站长删除:go mod配置项目模块自引用

发表评论