Go模块教程展示了如何在Golang中使用模块。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
模块是存储在文件树中的Go包的集合。
模块包含两个特定的文件:go.mod
和go.sum
。go.mod
定义了模块路径和依赖要求.go.sum
是一个自动生成的依赖锁文件。
模块使我们能够定义精确的依赖性要求并为多个环境设计可重现的构建。
第三方模块从其存储库下载到模块缓存中。然后在构建应用程序时从这些副本加载这些依赖项。模块缓存默认位于主目录的go
子目录中.
go模块命令
go工具提供了几个与模块相关的命令。
- gomodinit-初始化当前目录中的新模块
- gomodtidy-添加丢失的模块并删除未使用的模块
- gomoddownload-将模块下载到本地缓存
- gomodvendor-制作依赖项的vendored副本
- gomodgraph-打印模块需求图
- gomodverify-验证依赖项是否具有预期内容
- gomodwhy-解释为什么需要包或模块
还有一些与Go模块相关的额外命令。
golist-m
列出了可用的模块。goget
安装依赖项并更新go.mod文件。gobuild
和gotest
命令根据需要向go.mod添加新的依赖项。
gomod初始化
gomodinit
命令创建一个以当前目录为根的新模块。在当前目录中创建一个新的go.mod
文件;它必须不存在。
$ go mod init [module-path]
模块路径是用于导入该模块所有包的前缀路径。开发人员经常使用托管源代码的存储库的URL作为模块路径。
$ go mod init com.zetcode/first go: creating new go.mod: module com.zetcode/first
创建了一个带有com.zetcode/first
模块路径的新模块。
$ cat go.mod module com.zetcode/first go 1.17
这些是go.mod
文件的内容。我们有Go版本的模块路径。
goget命令
依赖项使用goget
命令安装。该命令会自动更新go.mod
文件并创建go.sum
文件。
$ go mod init com.zetcode/myprog
首先,我们创建一个模块。
$ go get gonum.org/v1/gonum/stat go: downloading gonum.org/v1/gonum v0.9.3 go get: added gonum.org/v1/gonum v0.9.3
我们安装Gonum库。它是一套Go语言的数值库。
$ ls go.mod go.sum
我们在当前工作目录中有go.mod
和go.sum
。
~/go/pkg/mod/gonum.org/v1/gonum@v0.9.3$ ls -1 appveyor.yml AUTHORS blas cmplxs CONDUCT.md CONTRIBUTING.md CONTRIBUTORS diff doc.go dsp floats go.mod GOPHER gopher.png gopher.svg go.sum graph integrate internal interp lapack LICENSE mat mathext num optimize README.md spatial stat THIRD_PARTY_LICENSES unit version.go
Gonum库作为模块分发;它默认安装在用户主目录的go
子目录中。
package main import ( "fmt" "math" "gonum.org/v1/gonum/stat" ) func main() { xs := []float64{ 12.44, 11.2, 34.5, 1.4, 6.7, 23.4, } fmt.Printf("data: %v\n", xs) mean := stat.Mean(xs, nil) variance := stat.Variance(xs, nil) stddev := math.Sqrt(variance) fmt.Printf("mean: %v\n", mean) fmt.Printf("variance: %v\n", variance) fmt.Printf("std-dev: %v\n", stddev) }
我们有一个计算一些基本统计数据的简单示例。
import ( "fmt" "math" "gonum.org/v1/gonum/stat" )
我们得到模块的stat
包。
$ go run first.go data: [12.44 11.2 34.5 1.4 6.7 23.4] mean: 14.94 variance: 145.12640000000002 std-dev: 12.046841909811883
$ go list -m all com.zetcode/myprog dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 gioui.org v0.0.0-20210308172011-57750fc8a0a6 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af github.com/boombuler/barcode v1.0.0 github.com/davecgh/go-spew v1.1.0 ...
使用golist-mall
,我们列出了项目的所有依赖项。
供应商
供应商是满足项目依赖性的一种特定方式。不使用默认模块缓存,而是从vendor
子目录下载并加载依赖项。该目录是项目目录的子目录。
$ go mod vendor
gomodvendor
命令在主模块的根目录中创建一个名为vendor的目录。该命令还会创建vendor/modules.txt
文件,其中包含销售包列表以及从中复制的模块版本。
$ go mod init com.zetcode/second $ go get github.com/bykof/gostradamus
我们创建一个项目并下载一个依赖项。gostradamus是一个用于处理日期和时间的库。
package main import ( "fmt" "github.com/bykof/gostradamus" ) func main() { now := gostradamus.Now() fmt.Println(now) }
该示例打印当前日期时间。
$ go mod vendor
我们初始化vendoring。
$ ls go.mod go.sum second.go vendor
我们已经创建了vendor
目录。
$ ls vendor/github.com/ bykof
它包含我们的依赖。
在本教程中,我们讨论了Go中的模块。
列出所有Go教程。