Go——使用 go mod ——有依赖的Go工程
一、依赖于github.com/kataras/iris/v12,写一个http服务, 返回Hello World
test.go
package main import ( iris "github.com/kataras/iris/v12" ) func main() { app := iris.New() app.Get("/", func(ctx iris.Context) { ctx.HTML("<h1>Hello World!</h1>") }) app.Run(iris.Addr(":8080")) }
代码中使用了 iris
1、可手动下载 go get github.com/kataras/iris/v12
2、使用 mod 管理依赖
初始化mod, war为模块名,可自定义
go mod init i.com/war
go.mod:
module i.com/war go 1.17 require github.com/kataras/iris/v12 v12.1.8
运行test.go,
go run test.go
依赖包会自动下载到 GOPATH/pkg/mod 目录下
运行成功,访问 http://localhost:8080/
二、关于go.mod
如果你的包引入的外部包不够好,你想重构怎么办?这个时候就靠replace命令出手了
go.mod:
module github.com/shgopher/short replace( github.com/shgoper/i v0.1.0 => github.com/shgopher/newShort v0.3.0 )
三、如何依赖本地包
1、新建本地包 ../model/mymodel.go
package model func Say() string { return "hi..." }
package关键字后的名字,model可理解为类名,因为之后调用它的方法是通过 model.Say() 来调用,
当然,也可在使用方用 import modelhh "i.com/model" 来定义别名,这样就可用modelhh.Say() 来调用。
另外,注意方法名首字母大写。
进入model目录执行 go mod init i.com/model
生成go.mod文件
module i.com/model go 1.17
初始化go.mod时,须指定模块名(域名/路径/名字),否则会报错 outside GOPATH, module path must be specified
这里的模块名一般为 域名/路径/名字, 最后的名字就用包名字,
当然不强制,非要定义为 themodel,既无域名也不与包名字一致,也不会报错。
但是若代码是github托管的,那模块名必然就是 github.com/xxinc/model 的形式,因为只有这样才能被mod管理。
2、新建本地main包 ../demo/mydemo.go
package main import ( "fmt" "i.com/model" ) func main(){ fmt.Println("demo main, say:") fmt.Println(model.Say()) }
这里的 import "i.com/model" ,要与自身go.mod中的模块名一样,
若代码是github托管的,那模块名就是 github.com/xxinc/model 的形式
进入demo目录执行 go mod init i.com/demo
生成go.mod文件
module demo/demo go 1.17 require i.com/model v0.0.0 replace i.com/model => ../model
由于i.com/model地址下并没有model的代码,需要用replace来替换成本地地址,
接下就可以在mydemo.go里调用model.Say()方法。
另,replace后面的两个地址,都用远程地址时,作用就是替换远程包地址,而不用修改源码中的import。
3、执行 go run mydemo.go
bogon:demo chong$ go run mydemo.go
demo main, say:
hi...
bogon:demo chong$
四、命令备份
go env
GOPROXY="https://proxy.golang.org,direct"
设置国内代理
go
env -w GOPROXY=https:
//goproxy.io,direct
go env -w GOPROXY=https://goproxy.io,direct
go mod init war
#添加需要用到但go.mod中查不到的模块
#删除未使用的模块
go mod tidy
参考: