我从本地项目(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)
解析 中的依赖项时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)
对于本地模块有一个解决方法,您可以replace
在go.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 包中的函数和变量应以大写字母开头,以便可以从包本身外部访问。
祝你好运!