over-golang/03-工程管理/02-gomod.md

112 lines
4.4 KiB
Go
Raw Permalink Normal View History

2021-07-02 18:11:59 +08:00
## go mod
go的项目依赖管理一直饱受诟病在go1.11后正式引入了`go modules`功能在go1.13版本中将会默认启用从此可以不再依赖gopath摆脱gopath的噩梦
`go mod` 初步使用
```
# 开启go mod
export GO111MODULE=on # 注意如果是win这里使用 set GO111MODULE=on
# 在新建的项目根目录下src下使用该命令
go mod init 项目名 # 此时会生成一个go.mod文件
# 使用
在项目中可以随时import依赖 go run 时候会自动安装依赖比如
import (
"github.com/gin-gonic/gin"
)
```
go run 后的 go.mod:
```
module api_server
go 1.12
require (
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 // indirect
github.com/gin-gonic/gin v1.3.0 // indirect
github.com/golang/protobuf v1.3.1 // indirect
github.com/mattn/go-isatty v0.0.7 // indirect
github.com/ugorji/go/codec v0.0.0-20190320090025-2dc34c0b8780 // indirect
gopkg.in/go-playground/validator.v8 v8.18.2 // indirect
gopkg.in/yaml.v2 v2.2.2 // indirect
)
```
使用`go mod`run产生的依赖源码不会安装在当前项目中而是安装在`$GOPATH/pkg/mod`
贴士如果我们安装的是go1.11以上版本且想要开启go mod那么可以给go配置环境如下
```
export GOROOT=/usr/local/go # golang本身的安装位置
export GOPATH=~/go/ # golang包的本地安装位置
export GOPROXY=https://goproxy.io # golang包的下载代理
export GO111MODULE=on # 开启go mod模式
export PATH=$PATH:$GOROOT/bin # go本身二进制文件的环境变量
export PATH=$PATH:$GOPATH/bin # go第三方二进制文件的环境便令
```
注意使用了go mod后go get安装的包不再位于$GOPATHA/src 而是位于 $GOPATH/pkg/mod
## 翻墙问题解决
#### 2.1 推荐方式 GOPROXY
Go 1.11 版本开始还新增了 GOPROXY 环境变量如果设置了该变量下载源代码时将会通过这个环境变量设置的代理地址而不再是以前的直接从代码库下载goproxy.io 这个开源项目帮我们实现好了我们想要的该项目允许开发者一键构建自己的 GOPROXY 代理服务同时也提供了公用的代理服务 https://goproxy.io我们只需设置该环境变量即可正常下载被墙的源码包了
```
# 如果使用的是IDEA开发时设置Goland的Prefrence-Go-proxy即可
# 如果使用的是VSCode
export GO111MODULE=on
export GOPROXY=https://goproxy.io
# 如果是win
set GO111MODULE=on
set GOPROXY=https://goproxy.io
# 关闭代理
export GOPROXY=
```
#### 2.2 replace方式
`go modules`还提供了 replace可以解决包的别名问题也能替我们解决 golang.org/x 无法下载的的问题
go module 被集成到原生的 go mod 命令中但是如果你的代码库在 $GOPATH module 功能是默认不会开启的想要开启也非常简单通过一个环境变量即可开启 export GO111MODULE=on
```go
module example.com/hello
require (
golang.org/x/text v0.3.0
)
replace (
golang.org/x/text => github.com/golang/text v0.3.0
)
```
#### 2.3 手动下载 旧版go的解决
我们常见的 golang.org/x/... 一般在 GitHub 上都有官方的镜像仓库对应比如 golang.org/x/text 对应 github.com/golang/text所以我们可以手动下载或 clone 对应的 GitHub 仓库到指定的目录下
mkdir $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone git@github.com:golang/text.git
rm -rf text/.git
当如果需要指定版本的时候该方法就无解了因为 GitHub 上的镜像仓库多数都没有 tag并且手动嘛程序员怎么能干呢尤其是依赖的依赖太多了
## go mod引起的变化
引包方式变化
- 不使用go mod 引包"./test" 引入test文件夹
- 使用go mod 引包"projectmodlue/test" 使用go.mod中的modlue名/包名
因为在go1.11后如果开启了`go mod`需要在src目录下存在go.mod文件并书写主module名一般为项目名否则无法build
开启`go mod`编译运行变化
- 使用vscode开发必须在src目录下使用 `go build`命令执行不要使用code runner插件
- 使用IDEA开发项目本身配置go.mod文件扔不能支持开发工具本身也要开启`go mod`支持位于配置的go设置中