猿问

从基于 GOPATH 的 dep 迁移到 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 模块时,当我运行go run main.go它时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

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


猛跑小猪
浏览 187回答 5
5回答

萧十郎

该go.mod文件应位于项目的根目录下(在本例中为my-api-server/go.mod)。模块路径的第一部分应该是域/路径。例如,完整路径可能是github.com/your-github-username/my-api-server. 您看到的错误是因为第一部分不是域(带有句点)。您不必发布模块来开发它,但您需要使用适当的域名。一旦有了模块路径,就可以使用完整模块路径+“/”+包的相对路径来导入该模块中包含的包。例如,import "github.com/your-github-username/my-api-server/my-utils/uuid"由于main.go和uuid包含在同一模块中,因此您不需要require在go.mod文件中声明即可使用该uuid包。您可以像任何其他包一样导入它并且它会起作用。我建议使用go build并运行生成的可执行文件,而不是使用go run它来确保包含构建过程中所需的所有文件。

森林海

检查 main.go 文件上的导入路径。我必须调用整个导入路径:github.com/[username]/[project-name]/views代替:[project-name]/views让它在我这边发挥作用。

一只萌萌小番薯

如果您尝试使用全局包(非标准),则包名称的第一部分应该有一个点('.')。可能需要点('.'),就像在任何 URL 中一样,在本例中为 github.com...,它将其标记为远程包。如果你想使用本地包,那么你需要使用 go 模块,那么第一部分将是你的 go 模块的名称(你在初始化 go 模块时使用的名称)。示例(根据问题):转到项目根文件夹(在本例中../src$)并运行以下命令go mod init myapiserver这将创建一个go.mod和go.sum文件。然后要导入uuid,您可以简单地myapiserver/my-utils/uuid在导入中使用import "myapiserver/my-utils/uuid"那么所有公共函数(以大写字母开头)都uuid.go可以在当前文件中访问

慕姐4208626

升级go版本到最新或1.16.1以上。go version >=1.16.1 (required)对于苹果机 -brew update brew upgrade golang对于 linux - 删除现有的 go,然后安装最新的。这对我有用。

摇曳的蔷薇

非常不寻常的情况,但我正在使用不正确/过时的符号链接main.go。将其链接到正确的文件修复了该错误。
随时随地看视频慕课网APP

相关分类

Go
我要回答