Golang构建结果出现意外的目录结构问题

Golang构建结果出现意外的目录结构问题 我安装了 Go 1.13.6。

运行 go test -c -o tester 来构建测试时出现以下错误:

unexpected directory layout:
        import path: _/mnt/c/Users/litang/githubWorkSpace/MIT-6.824repo/src/labrpc
        root: /mnt/c/Users/litang/githubWorkSpace/MIT-6.824repo/src
        dir: /mnt/c/Users/litang/githubWorkSpace/MIT-6.824repo/src/labrpc
        expand root: /mnt/c/Users/litang/githubWorkSpace/MIT-6.824repo
        expand dir: /mnt/c/Users/litang/githubWorkSpace/MIT-6.824repo/src/labrpc
        separator: /
ERROR: Build failed

GOPATH 设置为 /mnt/c/Users/litang/githubWorkSpace/MIT-6.824repo

当前工作目录是 $GOPATH/src/raft

gopath 目录结构:

├── Makefile
├── README.md
├── labs
│   ├── lab1
│   │   └── README.md
│   └── lab2
│       └── README.md
├── out2
└── src
    ├── kvraft
    │   ├── client.go
    │   ├── common.go
    │   ├── config.go
    │   ├── server.go
    │   └── test_test.go
    ├── labgob
    │   ├── labgob.go
    │   └── test_test.go
    ├── labrpc
    │   ├── labrpc.go
    │   └── test_test.go
    ├── raft
    │   ├── config.go
    │   ├── go_test_many.sh
    │   ├── loop_to_test_raft.sh
    │   ├── persister.go
    │   ├── raft.go
    │   ├── test_test.go
    │   └── util.go

在 raft.go 中,我的导入如下:

import (
	"bytes"
	"labgob"
	"labrpc"
	"math"
	"math/rand"
	"sync"
	"sync/atomic"
	"time"
)

我应该怎么做才能解决这个问题?


更多关于Golang构建结果出现意外的目录结构问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

据我所知,在 GOPATH 中,除了 srcpkgbin 作为子文件夹外,不允许存在其他内容。

通常,你可能希望将你的程序更新为使用模块,而不是使用传统的 GOPATH

更多关于Golang构建结果出现意外的目录结构问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这个错误是由于Go模块路径与目录结构不匹配导致的。在Go 1.13中,当使用GOPATH模式时,导入路径应该基于GOPATH/src目录。错误信息显示导入路径是 _/mnt/c/Users/litang/githubWorkSpace/MIT-6.824repo/src/labrpc,这表示Go工具无法正确解析模块路径。

解决方案是确保导入路径正确。在你的情况下,应该使用相对GOPATH/src的路径。修改raft.go中的导入语句:

import (
    "bytes"
    "math"
    "math/rand"
    "sync"
    "sync/atomic"
    "time"
    
    // 使用正确的导入路径
    "mit-6.824/src/labgob"
    "mit-6.824/src/labrpc"
)

或者,更好的方法是初始化Go模块。在你的项目根目录(MIT-6.824repo目录)运行:

cd /mnt/c/Users/litang/githubWorkSpace/MIT-6.824repo
go mod init mit-6.824

然后更新raft.go中的导入语句:

import (
    "bytes"
    "math"
    "math/rand"
    "sync"
    "sync/atomic"
    "time"
    
    "mit-6.824/src/labgob"
    "mit-6.824/src/labrpc"
)

如果不想使用Go模块,可以设置环境变量强制使用GOPATH模式:

export GO111MODULE=off
cd /mnt/c/Users/litang/githubWorkSpace/MIT-6.824repo/src/raft
go test -c -o tester

另一个快速解决方案是使用相对导入路径。修改raft.go:

import (
    "bytes"
    "math"
    "math/rand"
    "sync"
    "sync/atomic"
    "time"
    
    "../labgob"
    "../labrpc"
)

然后运行测试:

cd /mnt/c/Users/litang/githubWorkSpace/MIT-6.824repo/src/raft
go test -c -o tester

如果这些方法都不起作用,检查labrpc目录是否包含有效的Go包。确保labrpc目录下有go.mod文件或正确的包声明。在labrpc/labrpc.go中:

package labrpc

// 包内容...

运行go env确认环境设置:

go env GOPATH
go env GO111MODULE
回到顶部