【问题标题】:malformed module path "xxxx/xxxx/uuid" missing dot in first path element when migrating from GOPATH based dep to go mod从基于 GOPATH 的 dep 迁移到 go mod 时,格式错误的模块路径“xxxx/xxxx/uuid”在第一个路径元素中缺少点
【发布时间】:2020-02-16 19:07:33
【问题描述】:
$去版本 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 模块时,当我在 my-auth-server 中运行 go run main.go 时,它返回错误:

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 go-modules


【解决方案1】:

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.gouuid 包含在同一个模块中,因此您不需要go.mod 文件中的require 语句即可使用uuid 包。你可以像任何其他包一样导入它,它会起作用。

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

请参阅 https://blog.golang.org/using-go-modules 了解如何使用 Go 模块的演练,包括该系列中有关如何将项目转换为使用模块的 second post

【讨论】:

    【解决方案2】:

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

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

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

    代替:

    [project-name]/views 
    

    让它对我有用。

    【讨论】:

      【解决方案3】:

      因为 GO 找不到模块!!!

      不要把你的项目放在 GOPATH 里面……那太混乱了

      相反...

      在 .bashrc 中设置:export GO111MODULE=on

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

      进入项目根目录

      $ go mod init 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

      【讨论】:

      • Do not put your project inside GOPATH... that is so confusing - 这是一个约定,我特别喜欢。
      • 另外,错误是missing dot in first path element 而不是cannot resolve module
      • Ayush Gupta,错误是由不正确的模块使用引起的
      • 不正确的包版本有不正确的文件路径 => 导致 Golang 无法找到正确的文件来运行或构建
      【解决方案4】:

      如果您尝试使用全局包(非标准),包名的第一部分应该有一个点('.')。可能期望 dot('.') 就像它在任何 URL 中一样,在本例中为 github.com.... 将其标记为远程包。

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

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

      go mod init myapiserver
      

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

      然后要导入 uuid,你可以简单地在 import 中使用myapiserver/my-utils/uuid

      import "myapiserver/my-utils/uuid"
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-25
        • 2019-02-19
        • 2021-08-18
        相关资源
        最近更新 更多