格式错误 module 路径 "xxxx/xxxx/uuid" 从基于 GOPATH 的 dep 迁移到 go mod 时第一个路径元素中缺少点

malformed module path "xxxx/xxxx/uuid" missing dot in first path element when migrating from GOPATH based dep to go mod

$ go version
1.13.3

我的文件夹结构如下:

GOPATH
+---src
     +--- my-api-server
           +--- my-auth-server
                 +--- main.go
           +--- my-utils
                 +--- uuid
                       +--- uuid.go

my-auth-server 使用 my-api-server/my-utils/uuid 作为依赖项

现在,当我使用基于 GOPATH 的模块系统时,它运行良好。但是当使用 go modules 时,当我 运行 go run main.go in my-auth-server 它返回错误:

build command-line-arguments: cannot load my-api-server/my-utils/uuid: malformed module path "my-api-server/my-utils/uuid": missing dot in first path element

知道如何解决这个问题吗?

go.mod 文件应该位于项目的根目录(在本例中为 my-api-server/go.mod)。

模块路径的第一部分应该是domain/path。例如,完整路径可能是 github.com/your-github-username/my-api-server。您看到的错误是因为第一部分不是域(带句点)。您不必发布模块来开发它,但您需要使用适当的域名。

获得模块路径后,您可以使用完整模块路径 + “/” + 包的相对路径导入该模块中包含的包。例如,

import "github.com/your-github-username/my-api-server/my-utils/uuid"

由于 main.gouuid 包含在同一个模块中,您不需要 go.mod 文件中的 require 语句来使用 uuid 包。您可以像导入任何其他包一样导入它,它会起作用。

我建议使用 go build 和 运行 生成的可执行文件而不是使用 go run 以确保在构建过程中包含所有需要的文件。

请参阅该系列中的 https://blog.golang.org/using-go-modules for a walkthrough of how to use Go modules, including the second post,了解如何将项目转换为使用模块。

检查 main.go 文件中的导入路径。

我不得不调用整个导入路径:

github.com/[username]/[project-name]/views

而不是:

[project-name]/views 

让它对我有效。

因为 GO 找不到模块!!!

不要把你的项目放在 GOPATH 中...那太混乱了

而是...

在 .bashrc 中设置:export GO111MODULE=on

关闭所有命令行终端,然后重新打开终端

转到项目根文件夹

$ 去 mod 初始化 project_module_name

这将生成 go.mod 文件

用你想要的版本安装你的包: go get -v github.com/golang/protobuf@v1.3.4

然后运行$go run main.go

现在 go.mod 文件应该记录 Golang 将用于 运行 和构建的包版本...

通过检查 go.mod 文件确保您使用的软件包版本正确!它应该看起来像:github.com/golang/protobuf v1.3.4

如果您尝试使用全局包(非标准包),包名的第一部分应该有一个点('.')。可能需要点('.'),就像它在任何 URL 中所做的那样,在这种情况下 github.com...这将其标记为远程包。

如果你想使用本地包,那么你需要使用go module,那么第一部分就是你的go module的名称(你在go module初始化时使用的名称)。

示例(根据问题): 转到项目根文件夹(在本例中为 ../src$)& 运行 以下命令

go mod init myapiserver

这将创建一个 go.mod & go.sum 文件。

然后要导入uuid,你可以简单地在import

中使用myapiserver/my-utils/uuid
import "myapiserver/my-utils/uuid"

那么 uuid.go 中的所有 public 函数(以大写字母开头)都可以在当前文件中访问

升级 go 版本到最新或大于 1.16.1。

go version >=1.16.1 (required)

对于 mac -

brew update
brew upgrade golang

对于 linux - 删除现有的 go,并安装最新的。

这对我有用。