Links:
Go Modules Reference - The Go Programming Language
Using Go Modules - The Go Programming Language
Go 使用模块名初始化模块
$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello
go: to add module requirements and sums:
go mod tidy
上述命令创建了一个go.mod文件。
添加依赖
原博客说执行go test
时会自动下载依赖,但我测试后不行。
$ go env -w GOPROXY=https://goproxy.cn,direct
$ go test
hello.go:3:8: no required module provides package rsc.io/quote; to add it:
go get rsc.io/quote
通过 go get
会从源码中自动搜索所有依赖并下载,
$ go env -w GOPROXY=https://goproxy.cn,direct
$ go get
go: downloading rsc.io/quote v1.5.2
go: downloading rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
go: added golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
go: added rsc.io/quote v1.5.2
go: added rsc.io/sampler v1.3.0
$ cat go.mod
module example.com/hello
go 1.18
require rsc.io/quote v1.5.2
require (
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect
rsc.io/sampler v1.3.0 // indirect
)
在 go.mod 的第4行是直接依赖,后面的 // indirect
是间接依赖。在旧版的 go 中不显示间接依赖?
可以通过 go list -m all
列出当前模块和所有依赖。
$ go list -m all
example.com/hello
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
rsc.io/quote v1.5.2
rsc.io/sampler v1.3.0
第一行是当前模块,也称为主模块。后面的是依赖,依赖包含名称和版本号,第一个依赖是伪版本号,后面的是正常的语义版本标签。
go.sum 中包含了模块的哈希值。
更新依赖
$ go get golang.org/x/text
go: downloading golang.org/x/text v0.3.7
go: upgraded golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c => v0.3.7
相当于go get golang.org/x/text@latest
。
通过 go list 列出模块的所有版本,然后将latest
换成需要的版本:
$ go list -m -versions rsc.io/sampler
rsc.io/sampler v1.0.0 v1.2.0 v1.2.1 v1.3.0 v1.3.1 v1.99.99
使用不同主版本号的依赖
在添加依赖 rsc.io/quote/v3
之后,通过 go list -m
列出模块(可以使用…通配符)
$ go list -m rsc.io/...
rsc.io/quote v1.5.2
rsc.io/quote/v3 v3.1.0
rsc.io/sampler v1.3.0
每个主版本号都要使用不同的模块路径:从v2开始,模块路径必须以版本号结尾,因为不同的主版本号不兼容。
更新依赖到新的主版本号
package hello
import "rsc.io/quote/v3"
func Hello() string {
return quote.HelloV3()
}
func Proverb() string {
return quote.Concurrency()
}
即使导入了 quote/v3
,还可以在代码中使用 quote
这个名称。
总结
go mod init
creates a new module, initializing thego.mod
file that describes it.go build
,go test
, and other package-building commands add new dependencies togo.mod
as needed.go list -m all
prints the current module’s dependencies.go get
changes the required version of a dependency (or adds a new dependency).go mod tidy
removes unused dependencies.
GOPATH 是需要设置的,如果不设置默认是 ~/go
go 安装在 /usr/local/go
中