如何在另一个模块中使用 "GOPATH" 之外的模块?
How to use a module that is outside of "GOPATH" in another module?
我已经使用此命令 "go mod init database," 在 "database" 文件夹中的 "GOPATH" 之外创建了一个供个人使用的库,但我不知道:
- 如何在另一个模块中使用/导入这个模块?
OS: Windows 7, 去: v1.11
最简单且开箱即用的解决方案是将您的 database
包/模块放入 VCS(例如 github.com),以便其他包(在其他模块内)可以只需通过导入它来引用它:
import "github.com/someone/database"
如果这样做,您甚至不必手动 fiddle 处理 go.mod
文件,一切都将由 go 工具处理:它会自动识别并解决此问题依赖,下载并安装需要的包,也会自动更新go.mod
。
完全保留在本地磁盘上
如果您不想使用 VCS(例如,您只是在试验或尚未决定使用什么),那么您仍然可以这样做。 如何在官方有详细说明Go Wiki: Can I work entirely outside of VCS on my local filesystem?
因此,您在 GOPATH
之外创建了一个 database
文件夹,并在其中创建了一个模块。你创建了另一个模块,我们称它为 main
,你想使用这个 database
包。
你必须做的是:
您的 main
模块的 go.mod
必须将 database
包列为 "requirement"。为您的 database
包指定一个临时 VCS 名称:
require (
example.com/me/database v0.0.0
)
你必须告诉go工具这个包所在的位置,因为我们使用的完整包名只是一个临时/幻想的名字。使用 replace
指令使这个 database
包指向本地磁盘上的文件夹;你可以使用绝对路径和相对路径:
replace example.com/me/database => ../database
仅此而已。
工作示例
让我们看一个工作示例。让我们创建一个 pretty
模块。创建一个包含 2 个文件的 pretty
文件夹:
pretty.go:
package pretty
import "fmt"
func Pretty(v ...interface{}) {
fmt.Println(v...)
}
go.mod(可由运行go mod init pretty
创建):
module pretty
现在让我们创建另一个主模块。让我们在 pretty
文件夹旁边创建一个文件夹 osinf
(可以是任何内容)。其中有 2 个文件:
osinf.go(注意我们打算使用我们的 pretty
包/模块,我们通过 "example.com/me/pretty"
导入它):
package main
import "example.com/me/pretty"
func main() {
pretty.Pretty("hi")
pretty.Pretty([]int{1, 3, 5})
}
go.mod:
module main
require example.com/me/pretty v0.0.0
replace example.com/me/pretty => ../pretty
仅此而已。
运行 go run osinf.go
在osinf
文件夹下,输出为:
hi
[1 3 5]
运行:
go mod init yellow
然后创建文件yellow.go
:
package yellow
func Mix(s string) string {
return s + "Yellow"
}
然后创建文件orange/orange.go
:
package main
import "yellow"
func main() {
s := yellow.Mix("Red")
println(s)
}
然后构建:
go build
我已经使用此命令 "go mod init database," 在 "database" 文件夹中的 "GOPATH" 之外创建了一个供个人使用的库,但我不知道:
- 如何在另一个模块中使用/导入这个模块?
OS: Windows 7, 去: v1.11
最简单且开箱即用的解决方案是将您的 database
包/模块放入 VCS(例如 github.com),以便其他包(在其他模块内)可以只需通过导入它来引用它:
import "github.com/someone/database"
如果这样做,您甚至不必手动 fiddle 处理 go.mod
文件,一切都将由 go 工具处理:它会自动识别并解决此问题依赖,下载并安装需要的包,也会自动更新go.mod
。
完全保留在本地磁盘上
如果您不想使用 VCS(例如,您只是在试验或尚未决定使用什么),那么您仍然可以这样做。 如何在官方有详细说明Go Wiki: Can I work entirely outside of VCS on my local filesystem?
因此,您在 GOPATH
之外创建了一个 database
文件夹,并在其中创建了一个模块。你创建了另一个模块,我们称它为 main
,你想使用这个 database
包。
你必须做的是:
-
您的
go.mod
必须将database
包列为 "requirement"。为您的database
包指定一个临时 VCS 名称:require ( example.com/me/database v0.0.0 )
你必须告诉go工具这个包所在的位置,因为我们使用的完整包名只是一个临时/幻想的名字。使用
replace
指令使这个database
包指向本地磁盘上的文件夹;你可以使用绝对路径和相对路径:replace example.com/me/database => ../database
main
模块的 仅此而已。
工作示例
让我们看一个工作示例。让我们创建一个 pretty
模块。创建一个包含 2 个文件的 pretty
文件夹:
pretty.go:
package pretty
import "fmt"
func Pretty(v ...interface{}) {
fmt.Println(v...)
}
go.mod(可由运行go mod init pretty
创建):
module pretty
现在让我们创建另一个主模块。让我们在 pretty
文件夹旁边创建一个文件夹 osinf
(可以是任何内容)。其中有 2 个文件:
osinf.go(注意我们打算使用我们的 pretty
包/模块,我们通过 "example.com/me/pretty"
导入它):
package main
import "example.com/me/pretty"
func main() {
pretty.Pretty("hi")
pretty.Pretty([]int{1, 3, 5})
}
go.mod:
module main
require example.com/me/pretty v0.0.0
replace example.com/me/pretty => ../pretty
仅此而已。
运行 go run osinf.go
在osinf
文件夹下,输出为:
hi
[1 3 5]
运行:
go mod init yellow
然后创建文件yellow.go
:
package yellow
func Mix(s string) string {
return s + "Yellow"
}
然后创建文件orange/orange.go
:
package main
import "yellow"
func main() {
s := yellow.Mix("Red")
println(s)
}
然后构建:
go build