引用本地的 Go 模块

Kee*_*thi 5 go go-modules

我从本地项目(Go 模块)导入包失败。以下是我正在尝试的简要说明:

我创建了一个 Go 模块包,如下所示:

  $ cd 
  $ mkdir mymodule
  $ cd mymodule
  $ go mod init github.com/Company/mymodule
Run Code Online (Sandbox Code Playgroud)

然后我hello.go在下面添加了mymodule一个小功能

// mymodule/hello.go

package mymodule

func sayHello() string {
    return "Hello"
}
Run Code Online (Sandbox Code Playgroud)

go build那是成功的。

请注意,该模块尚未推送到 github 存储库。我想在推送到 github 之前使用(也许测试)mymodule。所以我创建了另一个包,如下所示:

  $ cd 
  $ mkdir test
  $ cd test
  $ go mod init github.com/Company/test
Run Code Online (Sandbox Code Playgroud)

test.go然后,在目录下创建一个新文件test,并在其中尝试导入mymodule,如下所示:

// test/test.go

import (
    "fmt"
    "github.com/Company/mymodule"
)

func testMyModule() {
    fmt.Println(mymodule.sayHello())
}

Run Code Online (Sandbox Code Playgroud)

go build失败test并出现以下错误。是什么赋予了?

cannot load github.com/Company/mymodule: cannot find module providing package github.com/Company/mymodule
Run Code Online (Sandbox Code Playgroud)

Nic*_*rin 8

解析 中的依赖项时go.mod,Go 将尝试通过从您提供的远程 URL 获取第三方模块来解析它们。

远程 URL 不存在,除非您已将其推送到 GitHub。这是当你收到如下错误时:

cannot load github.com/Company/mymodule: cannot find module providing package github.com/Company/mymodule
Run Code Online (Sandbox Code Playgroud)

对于本地模块有一个解决方法,您可以replacego.mod文件中使用关键字。

replace github.com/Company/mymodule v0.0.0 => ../mymodule
Run Code Online (Sandbox Code Playgroud)

这将使 Go 知道在哪里可以找到本地依赖项。只需确保使用模块的正确相对路径即可。

一旦您的本地测试完成并且您已将模块推送到存储库,那么您可以replace从您的代码中删除该行go.mod并使用

go get -u github.com/Company/mymodule`
Run Code Online (Sandbox Code Playgroud)

使模块与您当前的项目一起正常工作。

附带说明一下,Go 包中的函数和变量应以大写字母开头,以便可以从包本身外部访问。

祝你好运!

  • 是否可以将替换指令放在单独的文件模块文件中?必须修改潜在版本化文件来进行一些依赖项测试似乎很奇怪和危险。 (2认同)