Go Modules
官方文档:https://github.com/golang/go/wiki/Modules
https://go.dev/blog/using-go-modules
什么是Go Modules?
go module 是go官方自带的go项目依赖管理工具(类似于Java中的maven)。Go通过Go Modules的依赖管理统一了Go生态中众多的第三方的依赖管理。
go moudle取代旧的基于GOPATH方法来指定在工程中使用哪些源文件或导入包 。使用module时,GOPATH 不再用于解析导入。但是,它仍然用于存储下载的源代码(在 GOPATH/pkg/mod 中)和编译的命令(在 GOPATH/bin 中)。
go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等
使用go module之后我们可不用将代码放置在src下了
GOPATH的使用
目前在Go中存在两种开发模式,GOPATH mode 和 Go Modules mode。
在Go Modules之前,Go开发中的依赖管理使用GOPATH开发模式。在GOPATH开发模式中,Go命令使用GOPATH环境变量来实现以下几个功能:
1)go install 命令安装二进制库到 $GOBIN,其默认路径为 $GOPATH/bin
2)go install 命令安装编译好的包到 $GOPATH/pkg/ 中。
例如将example.com/y/z安装到$GOPATH/pkg/example.com/y/z.a
3)go get 命令下载源码包到$GOPATH/src/ 中。
例如将example.com/y/z下载到$GOPATH/src/example
在使用Go Modules 开发模式中,GOPATH变量的用处:
1)go install 命令安装二进制到 $GOBIN目录,其默认位置为$GOPATH/bin (与GOPATH开发模式相同)
2)go get命令缓存下载的Modules到$GOMODCACHE目录,默认位置为$GOPATH/pkg/mod
3)go get命令缓存下载的checksum数据到$GOPATH/pkg/sumdb目录
开启 Go Modules mode
Go 1.11起,可以显式启用 module模式(GO111MODULE=on)
go 命令允许在当前目录或任何父目录具有 go.mod 文件时使用模块模式,前提是该目录位于 $GOPATH/src 之外。($GOPATH/src 内部,为了兼容性,go 命令仍以旧的 GOPATH 模式运行,即使找到 go.mod 文件
在 Go 1.13,无需显式设置启用模块模式,只需设置 GO111MODULE=auto,如果发现任何 go.mod,即使在 GOPATH 内部,也表示启用模块模式。
(在 Go 1.13 之前,GO111MODULE=auto 永远不会在 GOPATH 内启用模块模式)
自 Go 1.14 以来,模块支持被视为可供生产环境使用,鼓励所有用户从其他依赖管理系统迁移到 Module。并且改回需显式设置启用模块模式
(通过设置 GO111MODULE=on),如果不存在 go.mod 文件,大多数模块命令的功能更有限
1)go env 查看环境变量配置
(base) ➜ go_study git:(master) ✗ go env GO111MODULE="" GOARCH="amd64" GOBIN="/Users/yangyongjie/dev/GoHomePath/bin" GOCACHE="/Users/yangyongjie/Library/Caches/go-build" GOENV="/Users/yangyongjie/Library/Application Support/go/env" GOEXE="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="darwin" GOINSECURE="" GOMODCACHE="/Users/yangyongjie/dev/GoHomePath/pkg/mod" GONOPROXY="" GONOSUMDB="" GOOS="darwin" GOPATH="/Users/yangyongjie/dev/GoHomePath" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/usr/local/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64" GOVCS="" GOVERSION="go1.16.3" GCCGO="gccgo" AR="ar" CC="clang" CXX="clang++" CGO_ENABLED="1" GOMOD="/Users/yangyongjie/GoProjects/my/go_study/go.mod" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/m5/5hxf5c2n1h12s87w952hhjbc0000gn/T/go-build1899619172=/tmp/go-build -gno-record-gcc-switches -fno-common"
2)若没有开启,修改 GO111MODULE 环境变量的值,开启 go module
go env -w GO111MODULE=on
Golang 1.16 中Module的一些变化
1)默认开启 Modules
2)不自动修改 go.mod 和 go.sum
3)通过指定 @version 后缀安装特定版本可执行文件
4)新增 retract 指令撤回 Module 版本
5)使用新增配置变量 GOVCS 指定特定模块使用特定版本控制工具
go mod 命令
命令 | 作用 |
---|---|
go mod init | 生成 go.mod 文件 |
go mod download | 下载 go.mod 文件中指明的所有依赖 |
go mod tidy | 整理现有的依赖 |
go mod graph | 查看现有的依赖结构 |
go mod edit | 编辑 go.mod 文件 |
go mod vendor | 导出项目所有的依赖到 vendor 目录 |
go mod verify | 校验一个模块是否被篡改过 |
go mod why | 查看为什么需要依赖某模块 |
GOPROXY
这个环境变量主要是用于设置 Go 模块代理(Go module proxy),其作用是用于使 Go 在后续拉取模块版本时能够脱离传统的 VCS 方式,直接通过镜像站点来快速拉取
GOPROXY 的默认值是:https://proxy.golang.org,direct,这有一个很严重的问题,就是 proxy.golang.org 在国内是无法访问的,因此这会直接卡住你的第一步,所以你必须在开启 Go modules 的时,同时设置国内的 Go 模块代理,执行如下命令:
go env -w GOPROXY=https://goproxy.cn,direct
GoLand配置GOPROXY:
初始化项目
进入项目文件夹,执行 go mod init 命令,根据我们的项目创建一个 Go Module
go mod init project_name 如: go mod init go_study go: creating new go.mod: module go_study go: to add module requirements and sums: go mod tidy
执行命令之后,会在项目根目录下生成go.mod文件,里面包含了所有的三方包,内容如:
module go_study go 1.16 require ( github.com/gin-gonic/gin v1.7.7 github.com/go-redis/redis/v8 v8.11.4 github.com/gomodule/redigo v1.8.6 )
说明:
module:用于定义当前项目的模块路径
go:用于标识当前模块的Go语言版本,值为初始化模块时的版本,目前来看还只是个标识作用
require:用于设置一个特定的模块版本
exclude:用于从使用中排除一个特定的模块版本
replace:用于将一个模块版本替换为另外一个模块版本
go build 和 go install:
区别:
go build:编译包及其依赖项,但不安装包,在项目目录下生成可执行文件(有main包)
go install:编译并安装包
1)编译生成可执行文件(有main包),将可执行文件放到 bin 目录($GOPATH/bin)
2)安装包文件(无main包),将编译后的包文件放到 pkg 目录下($GOPATH/pkg)。
相同点:
都会生成可执行文件
不同点:
go build不能生成包文件,go install可以生成包文件
go build生成的可执行文件在当前目录下,go install生成的可执行文件在bin目录下($GOPATH/bin)
1、go build
在编译包时,会忽略以 '_test.go' 结尾的文件
命令使用: go build [-o 输出目录] [build flags] [packages]
-o 强制构建的可执行文件输出到指定的输出文件或目录
build flags:
build flag | 作用 |
-a | force rebuilding of packages that are already up-to-date |
-n | print the commands but do not run them. |
-p n |
the number of programs, such as build commands or test binaries, that can be run in parallel. |
-race |
enable data race detection. |
-mod mode |
module download mode to use: readonly, vendor, or mod. |
2、go install
go install注意:
将 Go 安装目录添加到系统的 shell 路径,这样您将能够运行程序的可执行文件,而无需指定可执行文件的位置:
On Linux or Mac, run the following command:export PATH=$PATH:/path/to/your/install/directory
On Windows, run the following command:set PATH=%PATH%;C:\path\to\your\install\directory
END.