问题描述
我有以下结构:
gateway-service
config
config.go
go.mod
go.sum
service.go
logger
logger.go
go.mod
go.sum
import (
"errors"
"os"
"strings"
"github.com/spf13/viper"
)
现在,顶级包很好并且可以正确导入。但是,viper 包没有。错误信息是:
Could not import github.com/spf13/viper (cannot find package "github.com/spf13/viper" in any of
/Users/me/.go/src/github.com/spf13/viper (from $GOROOT)
/Users/me/go/src/github.com/spf13/viper (from $GOPATH))compiler
同样的问题发生在 logger.go
文件中:
package logger
import (
"context"
"go.uber.org/zap"
)
错误是:
Could not import go.uber.org/zap (cannot find package "go.uber.org/zap" in any of
/Users/me/.go/src/go.uber.org/zap (from $GOROOT)
/Users/me/go/src/go.uber.org/zap (from $GOPATH))compiler
我试过安装:
go get github.com/spf13/viper
go get go.uber.org/zap
go mod tidy
网关服务/go.mod
module github.com/puul/gateway-service
go 1.15
require github.com/spf13/viper v1.3.2
记录器/go.mod
module github.com/puul/logger
go 1.15
require (
go.uber.org/multierr v1.6.0 // indirect
go.uber.org/zap v1.16.0
)
转到环境:
▶ echo $GOPATH
/Users/me/go
▶ echo $GOROOT
/Users/me/.go
在相关说明中,我很想知道是否有更简单的方法来实现这样的结构:
pkg
logger
logger.go
services
gateway
编辑
我的猜测是我在模块和 GOPATH 之间有某种冲突。坦率地说,从文档中不清楚两者是如何相互作用的。结果,自动导入在 VSCode 中似乎被破坏了。它应该从导入中给出的路径中拉出,但事实并非如此。决定导入路径的是核心问题。
解决方法
错误消息中的 (from $GOPATH)
字符串表示产生该错误的 go
命令调用在 GOPATH
模式下运行,而不是在模块模式下运行——这可能意味着您当前的工作目录不在这两个模块中。
一般来说,除非您非常需要在不同时间发布不同的软件包集,否则我们建议您为您的代码使用单个模块。
如果您使用 VSCode 跨多个模块编辑代码,您可能需要配置您的工作区以告诉它哪个是主模块;请参阅 build.experimentalWorkspaceModule
设置。
您可能还需要(或想要)使用 replace
directive 将 logger
模块连接到 gateway-service
模块中。