vscode 中无法编译 mit-6.824 lab1 中的 wc.go 文件

最近在学习 MIT 上发布的分布式系统设计课程
按照 lab1 的步骤执行:

git clone git://g.csail.mit.edu/6.824-golabs-2020 6.824
cd ~/6.824
cd src/main
go build -buildmode=plugin ../mrapps/wc.go

在vscode中执行后会提示:

build command-line-arguments: cannot find module for path _/.../go/6.824-golabs-2020/src/mr

接着尝试用sudo去执行,居然可以进行编译!( ̄△ ̄;)
后面发现vscode中的Go Extension查看文件的时候会报错提示:

go: cannot find main module, but found .git/config in /.../go/6.824-golabs-2020
    to create a module there, run:
    cd ../.. && go mod init

这个应该是没有初始化包管理的原因,所以进行了包管理初始化:

go mod init 6.824-golabs-2020

这样就解决了报错提示。
但是初始化包管理之后,即使是采用sudo去执行go build -buildmode=plugin ../mrapps/wc.go依然出现:

build command-line-arguments: cannot find module for path _/.../go/6.824-golabs-2020/src/mr

所以请教下社区大佬们:

  • 为什么执行sudo之后就可以build了,可不可以不用sudo?
  • mod init之后,怎么样才能够进行build?
  • 还有没有更好的配置建议?

THX~

最佳答案

go项目启用了包管理之后,相对路径的引入就会失效(目前还未找到解决方法),引入的方式需要改成以 go mod 配置的 module 为根的路径。附上 go.mod

// 6.824-golabs-2020/go.mod
module 6.824-golabs-2020

go 1.14

后面将 6.824-golabs-2020/src/mrapps/wc.go 中的引入 ../mr 改成 6.824-golabs-2020/src/mr 即可。

不过这个项目很多文件都采用了相对路径引入,也不是很好改啊,而且也不推荐采用相对路径。

就先这样将就着用吧。

4年前 评论
讨论数量: 5

从你的描述上来说, sudo 相关的应该是权限问题。 然后 go mod init , 这个是生成 mod.go 文件的操作,请确认你开启了 go mod 模式. 如何确认是否开启? 执行 go env ,出现 GO111MODULE=on。 如果确认开启,那么 go 会到 你的 ***\go\pkg\mod 类似的目录下查找依赖。 而不是去到 ***\go\src 你的 gopath 路径查找依赖。

至于最后的 cannot find module for path _/.../go/6.824-golabs-2020/src/mr 错误,很明显是目录不存在,请确认这个目录的位置,然后根据你的代码去修改(因为你没有贴代码我也无法提供具体的什么建议。)。

以上都是基础,不熟悉的化可以看看 go 的基础文档或者教程。

4年前 评论

不好意思,没有详细贴上代码地址。

这是MIT的分布式系统设计课程。按照 lab1 的步骤执行:

git clone git://g.csail.mit.edu/6.824-golabs-2020 6.824
cd ~/6.824
cd src/main
go build -buildmode=plugin ../mrapps/wc.go

PS. 以上的内容已经补充到问题里面了

4年前 评论

@eddieyeung 尝试在 6.824-golabs-2020/src 目录下新建文件夹 mr,看看是否能解决问题

4年前 评论

go项目启用了包管理之后,相对路径的引入就会失效(目前还未找到解决方法),引入的方式需要改成以 go mod 配置的 module 为根的路径。附上 go.mod

// 6.824-golabs-2020/go.mod
module 6.824-golabs-2020

go 1.14

后面将 6.824-golabs-2020/src/mrapps/wc.go 中的引入 ../mr 改成 6.824-golabs-2020/src/mr 即可。

不过这个项目很多文件都采用了相对路径引入,也不是很好改啊,而且也不推荐采用相对路径。

就先这样将就着用吧。

4年前 评论

遇到同问题, 还原成以前的module模式就行 步骤如下:

  1. 直接改用 $ go env -w GO111MODULE=off 把go module关闭
  2. 然后把6.824文件夹放在$GOPATH下面(e.g. /root/go)

亲测 可以使用

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!