如果想要在一个模块中引入本地的另一个模块,可以使用replace方法来完成。


本地项目1:hsl-hq

code/hsl/hsl-hq  
.
├── README.md
├── go.mod
├── market
│   ├── internal
│   │   ├── hk
│   │   │   ├── tradeday.go
│   │   │   └── tradeday_test.go
│   │   └── nohk
│   │       ├── tradeday.go
│   │       └── tradeday_test.go
│   ├── tradeday.go
│   └── tradeday_test.go
└── vendor
    └── vendor.json

本地项目2:hk-search

code/hsl/hk-search  
.
├── Makefile
├── README.md
├── cmd
│   ├── main.go
└── src
    ├── serv
    │   ├── ma.go
    └── util
        └── util.go

hk-search 依赖 hsl-hq里的方法,项目使用gomod管理依赖,想要导入本地hsl-hq中的方法需要执行一下步骤 1. 在hsl-hq中把module改为域名/hsl-hq的形式,如改成itstudying.com/hsl-hq。 2. 在hsl-hqhk-search中把导入的路径改为itstudying.com/hsl-hq前缀的形式 3. 在hk-search中执行命令把itstudying.com/hsl-hq替换为../hsl-hq../hsl-hqhsl-hqhk-search的本地相对路径

go mod edit -replace itstudying.com/hsl-hq=../hsl-hq

踩坑

  1. 在 go1.13 中, gomod 名称规范要求路径的第一部分必须满足域名规范,否则可能汇报类似 malformed module path "article": missing dot in first path element 这样的错误。当然,在 go1.12 不会有报这个错误。如果是公司内部使用,建议可以替换成公司内部域名。所以在hsl-hq这个项目中初始化gomod必须使用go mod init itstudying.com/hsl-hq这种方式,且本项目和调用方导入包时前缀要和module名一致,否则依然会报上面的错误

    go.mod 文件:
    
    module itstudying.com/hsl-hq
    
    go 1.13
    
    导入
    
    import (
    	"errors"
    	"itstudying.com/hsl-hq/utils"
    	"strconv"
    	"time"
    )
    
  2. 项目中使用了github.com/Sirupsen/logrus这个库,需要把项目名Sirupsen替换成sirupsen

    go mod edit -replace github.com/Sirupsen/logrus@v1.4.2=github.com/sirupsen/logrus@latest
    
  3. hk-search中执行go mod tidy报错提示如下所示,这是因为hsl-hq中把module设置成了itsutdying.com/hsl-hq,此时把hk-search中的所有hsl-hq改成itstudying.com/hsl-hq就行了。

    报错提示 
    
    hk-search/src/serv imports
        hsl-hq/market: malformed module path "hsl-hq/market": missing dot in first path element