美文网首页GO
go mod配置项目模块自引用

go mod配置项目模块自引用

作者: 鹅鹅鹅_ | 来源:发表于2019-07-28 12:14 被阅读0次

    以前也写过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配置项目模块自引用

        本文链接:https://www.haomeiwen.com/subject/pfpurctx.html