系统环境
| 组件 | 版本 |
|---|---|
| MacOS | 10.15.7 (19H1323) |
| go | 1.16 |
下载代码
# 下载项目代码
$ git clone git://g.csail.mit.edu/6.824-golabs-2020 6.824
# 进入项目根目录
$ cd 6.824
运行wordcount样例程序
# 进入项目main目录
$ cd src/main
# 编译wordcount程序可执行文件
$ go build -buildmode=plugin ../mrapps/wc.go
但是,这个时候一般会出现以下的错误:
详见:
(base) ➜ main git:(master) ✗ go build -buildmode=plugin ../mrapps/wc.go
build command-line-arguments: cannot find module for path _/Users/symsimmy/projects/mit/6.824/src/mr
原因是,早期的go版本是支持相对路径引用的,但是最新的go mod是不支持的,可以通过下面的方式,确认自己的go版本是否开启了go mod。
go env
出现 GO111MODULE=on,就代表开启了。关于go mod的相关知识,可以简单看一下这个文档Go go.mod入门。
那么,如何解决呢?我们可以将lab中的代码,修改为go module的方式。
首先,回到项目根目录,即6.824:
(base) ➜ 6.824 git:(master) ✗ pwd
/Users/symsimmy/projects/mit/6.824
(base) ➜ 6.824 git:(master) ✗ ls
Makefile src
接着,我们创建一个module,叫6.824-golabs-2020:
(base) ➜ main git:(master) ✗ go mod init 6.824-golabs-2020
go: creating new go.mod: module 6.824-golabs-2020
这时候,根目录下面就有了一个go.mod,内容为:
module 6.824-golabs-2020
go 1.16
接下来,修改代码,需要修改的地方主要有两处:
- 修改
src/main/mrsequential.go第10行,修改为import "6.824-golabs-2020/src/mr"; - 修改
src/mrapps/wc.go第9行,修改为import "6.824-golabs-2020/src/mr";
我们继续编译wc.go文件为可执行程序。
$ cd src/main
$ go build -buildmode=plugin ../mrapps/wc.go
接下来,就可以正常运行wordcount程序了。
# 删除上一次结果
$ rm mr-out*
# 运行wordcount程序
$ go run mrsequential.go wc.so pg*.txt
# 分页查看运行结果
$ more mr-out-0
运行结果如下: