我正在试用Go的新模块系统,无法访问本地软件包。以下项目位于我的gopath外的桌面上的文件夹中。
我的项目结构如下:
/
- /platform
- platform.go
- main.go
- go.mod
// platform.go
package platform
import "fmt"
func Print() {
fmt.Println("Hi")
}
// main.go
package main
import "platform"
func main() {
platform.Print()
}
go build main.go
告诉我
cannot find module for path platform
答案 0 :(得分:16)
我强烈建议您使用go工具链,它可以开箱即用地解决这些问题。带有vscode-go插件的Visual Studio Code真的很有用。
这里的问题是Go需要相对于import语句中的$GOPATH/src
或module
的相对路径。根据您在GOPATH
中的位置,导入路径也应包括该位置。在这种情况下,import语句必须在go.mod
GOPATH
假设您的项目位于此处:
$GOPATH/src/github.com/myuser/myproject
您的导入路径应为:
import "github.com/myuser/myproject/platform"
VGO
假设您的go.mod文件为:
module example.com/myuser/myproject
您的导入路径应为:
import "example.com/myuser/myproject/platform"
答案 1 :(得分:7)
让我定义第一个modules
是packages
的集合。在Go 11中,我使用gentle introduction如下:
如果两个软件包都在同一个项目中,则可以执行以下操作:
在go.mod
中:
module github.com/userName/moduleName
并在您的main.go
import "github.com/userName/moduleName/platform"
但是,如果它们是单独的模块,即不同的物理路径,并且您仍想导入本地packages
,而不必将此远程发布到github,则可以使用replace
指令来实现。 / p>
给出的模块名称github.com/otherModule
和platform
是其中唯一的软件包。在主模块的go.mod
中添加以下行:
module github.com/userName/mainModule
require "github.com/userName/otherModule" v0.0.0
replace "github.com/userName/otherModule" v0.0.0 => "local physical path to the otherModule"
注意:路径应指向模块的根目录,并且可以是绝对路径或相对路径。
在main.go
内,从platform
导入特定的包,例如otherModule
:
import "github.com/userName/otherModule/platform"
这是Golang模块的{{3}}
答案 2 :(得分:0)
作为一个新人,我并没有立即理解接受的答案 - 顺便说一句,这很棒。这是针对那些新人的简短回答!
在 go 中,模块/包表示为您在代码中导入的 url:
import your.org/internal/fancy_module
但是等等!我的代码不在网址中,发生了什么?
这就是go的聪明之处。即使没有网址,您也假装有网址。因为:
google.com/go-api/user
与 your.org/internal/user
Evan 说的很好,但我如何导入相对路径?
好问题!您可以通过更改 go.mod
文件以包含以下行来导入:
module fancy_module
go 1.16
replace your.org/fancy_module => ../path/to/fancy_module