go mod 是golang的包管理模块。
一下都在golang环境搭建好之后开始。
使用go mod又如下方法:
初始化项目:
- 新建目录,并进入目录执行go mod init 项目名称,例如:mkdir test&&cd test&&go mod init github.com/li/testgolang,这样会再test/下新建一个文件go.mod 记录当前项目的信息,之后使用go get 就会自动把依赖的包信息写入到 go.mod下。
- vender 执行命令go mod vendor 就会把go mod中所记录的包的依赖都复制到当前目录的vendor下,之后编译使用go build -mod=vendor 就是自动使用vendor目录下的依赖包来管理依赖,可以用发布版本的是时候执行一次,然后提交到发布的分支上去,这样就能保证发布的版本的全部依赖都一致。
go replace 对付翻墙 ,比如Photon依赖的go-ethereum实际上不是官方的任何一个版本,是根据我们自己的需要,做了修改的版本. 那么这时候也很简单,直接clone一个官方的版本到自己的github上,然后修改. 待修改完毕以后,新建一个版本即可.
比如我就把 github.com/ethereum/go-ethereum clone到我自己的github上,然后按照vendor中的修改重新来一 遍,然后打了一个v1.9.1的tag.
然后同样replace成下面的.
replace (
github.com/ethereum/go-ethereum v1.8.17 => github.com/nkbai/go-ethereum v1.9.1
)
注意:
由于go mod目前处于较早起版本,我们手工修改文件要特别注意 否则会碰到莫名其妙的问题.我说一下我碰到的 两个问题- replace和(之间的空格一定不能少
- => 前后的空格一定不能少
- 如果替换的版本号不知道是多少,直接写latest,go会自己找到最新版本填上去.
- replace在下面的情况下没有起效果。
- 设置 replace google.golang.org/grpc => github.com/grpc/grpc-go latest
- 执行go get google.golang.org/grpc
- go get google.golang.org/grpc 报如下错误:go get google.golang.org/grpc: unrecognized import path “google.golang.org/grpc” (https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
解决方法,暂没有完备解决方法,除非翻墙- 解决办法:
- 先再go.mod文件中添加依赖,并且在后面添加//indirect
- 在replace中添加replace
- 例子:
replace google.golang.org/grpc => github.com/grpc/grpc-go v1.20.1
require google.golang.org/grpc v1.20.1 // indirect - 然后运行go list -m -json all 刷新下依赖
- 注意在刷新依赖的过程中要根据包错信息把不能下载的依赖使用replace来替换掉,这和直接go get 不同,直接go get 的依赖如果是翻墙的不会走replace,需要在go.mod中先添加依赖然后刷新依赖才会走replace
