搭建etcd 源码阅读环境:解决import报错问题

| 分类 分布式系统  | 标签 分布式  分布式一致性  raft  Raft  etcd  go  GoLand  GOPATH  go.mod  Go依赖管理 

https://github.com/etcd-io/etcd 用tag 的方式下载的源码因为目录下面缺少go.mod、go.sum 文件,然后自己去手动添加的话可能版本不对

因为在api/ 下面还需要一些go.sum,比如我手动在根目录下加了go.mod 之后,在GoLand 里面针对import 里面的报错点击【Sync dependencies of etcd-3.2.0】

会出现这个报错,说明还是缺少其他目录的go.mod

我现在的方案是下载https://github.com/etcd-io/etcd 的main 分支,它是带有go.mod 和go.sum 的,下载下来后直接用GoLand 打开即可(当前的etcd 版本不再是3.2.0,所以代码和3.2.0 会有所不同)

当然也可以去找一下带有go.mod 的3.2.0 版本的etcd 源码包!

main 分支下载的好像不是完整的代码,简单看了一下Documentation 里面缺少很多文档;raft、lease、mvcc、rafthttp、snap、store 等包没有

还可能会出现报错,比如在etcdmain/etcd.go (和3.2.0 版本的代码稍微不同)里面的import 中

import (
	"fmt"
	"os"
	"runtime"
	"strings"
	"time"

	"go.uber.org/zap"
	"google.golang.org/grpc"

	"go.etcd.io/etcd/client/pkg/v3/fileutil"
	"go.etcd.io/etcd/client/pkg/v3/logutil"
	"go.etcd.io/etcd/client/pkg/v3/types"
	"go.etcd.io/etcd/pkg/v3/osutil"
	"go.etcd.io/etcd/server/v3/embed"
	"go.etcd.io/etcd/server/v3/etcdserver/api/v2discovery"
	"go.etcd.io/etcd/server/v3/etcdserver/errors"
)

在GoLand 中会发现go.uber.org/zap 部分还是编译报错,点击【Sync dependencies of etcd】,还是会报错

试着在终端中执行命令,还是出现报错

xumenger-mac:etcd xumenger$ go get -u go.uber.org/zap
warning: GOPATH set to GOROOT (/usr/local/go/) has no effect
package go.uber.org/zap: cannot download, $GOPATH must not be set to $GOROOT. For more details see: 'go help gopath'

这个警告就很关键了,说我把GOPATH 环境变量设置为GOROOT 了

翻看之前搭建Golang 环境的文章:一篇学会Golang!,我确实是这样设置环境变量的

export GOPATH="/usr/local/go/"

# 注意设置GOOS 很重要,否则后续syscall.Sethostname 等syscall 下面的API 调用都会报错:undefined: syscall.Sethostname
export GOOS="linux"

export PATH=$PATH:$GOPATH/bin

所以专门新建一个路径作为GOPATH 的环境变量值,设置为

export GOPATH="/Users/xumenger/Desktop/library/gopath/"

然后使配置生效之后,再次在GoLand 里面为import 报错的地方点击【Sync dependencies of etcd】,现在所有的依赖包都可以正确下载了,然后编译报错的问题都正常解决了




如果本篇文章对您有所帮助,您可以通过微信(左)或支付宝(右)对作者进行打赏!


上一篇     下一篇