在 go 模块中访问本地包 (go 1.11)
Accessing local packages within a go module (go 1.11)
我正在试用 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
我强烈建议您使用 go 工具链,它开箱即用地解决了这些问题。 Visual Studio 使用 vscode-go 插件的代码非常有用。
这里的问题是 Go 需要相对于导入语句中的 $GOPATH/src
或 module
的相对路径。根据您在 GOPATH
中的位置,导入路径也应包括它。在这种情况下,import 语句必须在 go.mod
中包含 go 模块路径
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"
先定义一下modules
是packages
的集合。在 Go 11 中,我像下面这样使用 go modules:
如果两个包在同一个项目中,您可以执行以下操作:
在 go.mod
中:
module github.com/userName/moduleName
在你的main.go
里面
import "github.com/userName/moduleName/platform"
但是,如果它们是单独的模块,即不同的物理路径,并且您仍然希望导入本地 packages
而无需将其远程发布到 github,例如,您可以使用 replace
指令。
鉴于模块名称 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
中,从 otherModule
:
导入特定的包,如 platform
import "github.com/userName/otherModule/platform"
这是 Golang 模块gentle introduction
作为新手,我没有立即理解接受的答案 – 顺便说一句,这很好。这是为那些非常新的人准备的更简短的答案!
在 go modules/packages 中表示为您在代码中导入的 url:
import your.org/internal/fancy_module
但是等等!我的代码不在 url,这是怎么回事??
这就是围棋的高明之处。你假装有一个url,即使实际上没有。因为:
- 这使得包含更容易,因为无论您的文件位于何处,导入都使用相同的 url(即使文件移动,代码也保持不变!)
- 您的软件包可能存在命名冲突。所以
google.com/go-api/user
与 your.org/internal/user
的定义不冲突
- 有一天您可能会在 GitHub 上发布一个 url,所有代码都会正常工作
Evan 太棒了,但是如何导入相对路径?
好问题!您可以通过将 go.mod
文件更改为包含此行来导入:
module fancy_module
go 1.16
replace your.org/fancy_module => ../path/to/fancy_module
给定 Golang 项目结构
/
- /platform
- platform.go
- main.go
- go.mod
从 /platform 的本地包访问方法或结构...等(public)很简单,如下所示
// main.go
主包
import (
p "./platform"
)
func main() {
p.Print()
}
这应该有效
我正在试用 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
我强烈建议您使用 go 工具链,它开箱即用地解决了这些问题。 Visual Studio 使用 vscode-go 插件的代码非常有用。
这里的问题是 Go 需要相对于导入语句中的 $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"
先定义一下modules
是packages
的集合。在 Go 11 中,我像下面这样使用 go modules:
如果两个包在同一个项目中,您可以执行以下操作:
在 go.mod
中:
module github.com/userName/moduleName
在你的main.go
import "github.com/userName/moduleName/platform"
但是,如果它们是单独的模块,即不同的物理路径,并且您仍然希望导入本地 packages
而无需将其远程发布到 github,例如,您可以使用 replace
指令。
鉴于模块名称 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
中,从 otherModule
:
platform
import "github.com/userName/otherModule/platform"
这是 Golang 模块gentle introduction
作为新手,我没有立即理解接受的答案 – 顺便说一句,这很好。这是为那些非常新的人准备的更简短的答案!
在 go modules/packages 中表示为您在代码中导入的 url:
import your.org/internal/fancy_module
但是等等!我的代码不在 url,这是怎么回事??
这就是围棋的高明之处。你假装有一个url,即使实际上没有。因为:
- 这使得包含更容易,因为无论您的文件位于何处,导入都使用相同的 url(即使文件移动,代码也保持不变!)
- 您的软件包可能存在命名冲突。所以
google.com/go-api/user
与your.org/internal/user
的定义不冲突
- 有一天您可能会在 GitHub 上发布一个 url,所有代码都会正常工作
Evan 太棒了,但是如何导入相对路径?
好问题!您可以通过将 go.mod
文件更改为包含此行来导入:
module fancy_module
go 1.16
replace your.org/fancy_module => ../path/to/fancy_module
给定 Golang 项目结构
/
- /platform
- platform.go
- main.go
- go.mod
从 /platform 的本地包访问方法或结构...等(public)很简单,如下所示
// main.go 主包
import (
p "./platform"
)
func main() {
p.Print()
}
这应该有效