多模块从错误的路径导入

问题描述

我有以下结构:

gateway-service
  config
    config.go
  go.mod
  go.sum
  service.go
logger
  logger.go
  go.mod
  go.sum

config.go 中,我导入以下内容


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 directivelogger 模块连接到 gateway-service 模块中。