注:本文是以Go SDK v1.18进行讲解
1.创建总目录
2.创建mypkg项目
创建mypkg项目
删除go.mod文件
在mypkg项目下创建bar.go文件
package mypkg
func Bar() {
println("This is package mypkg")
}
输入以下,为咱的模块起个名字(注:这只是起名字,并不是上传到网上)
go mod init github.com/polaris1119/mypkg
3.创建example项目
创建example项目
删除go.mod文件
在example项目下创建main.go文件
package main
import (
"github.com/polaris1119/mypkg"
)
func main() {
mypkg.Bar()
输入以下,为咱的模块起个名字(注:这只是起名字,并不是上传到网上)
go mod init github.com/polaris1119/example
这时候,如果我们运行 go mod tidy,肯定会报错,因为我们的 mypkg 包根本没有提交到 github 上,肯定找不到;
go run main.go 也就不成功。
解决方案一:
我们可以提交 mypkg 到 github,但我们每修改一次 mypkg,就需要提交,否则 example 中就没法使用上最新的;
解决方案二:
通过 replace 来解决,通过 replace 间接的引用到mypkg,即在 example 中的 go.mod 增加如下 replace,main.go
成功引用到本地的mypkg,main.go不再爆红。缺点是:当都开发完成时,我们需要手动删除 replace,并执行 go mod tidy 后提交,否则别人使用就报错了,这还是挺不方便的,如果本地有多个 module,每一个都得这么处理;
module github.com/polaris1119/example
go 1.18
require github.com/polaris1119/mypkg v1.0.0
replace github.com/polaris1119/mypkg => ../mypkg
4.工作区模式
解决方案三:
Workspace Mode
针对上面的这个问题,Michael Matloob 提出了 Workspace Mode(工作区模式)
在 polarisxu 目录执行如下,go work init之后跟上需要本地开发的子模块目录名
go work init ./mypkg ./example
注:建议多个子模块应该在一个目录下,比如这两个子模块都放在 polarisxu 目录下;(这不是必须的,但更好管理,否则 go work init 需要提供正确的子模块路径)
注:如果之后有别的子模块需要加入工作模式的话,使用“go work use 项目目录”这个命令,例如“go work use ./hello”
现在,我们将 example/go.mod 中的 replace 语句删除,再次执行 go run main.go(在 example 目录下),得到了正常的输出。也可以在 polarisxu 目录下,这么运行:go run example/main.go,也能正常。
注意,go.work 不需要提交到 Git 中,因为它只是你本地开发使用的
虽然爆红却能运行