go에는 해당 종속성을 직접 얻을 수 있는 go get
명령이 내장되어 있습니다. 매우 편리하지만 버전 유지 및 관리가 없다는 점이 큰 문제이고, 버전이 일치하지 않으면 다양한 호환성 문제가 발생할 수 있어 dep 및 <code>glide
그 중 최고인 Go 1.11에서 공식은 마침내 자체 종속성 관리 도구인 mod
를 출시했으며 이는 Go 버전에 내장되었습니다. >go mod는 사용하기 쉽고 강력하며 가능합니다. 대부분의 이전 타사 도구와 자동으로 호환되며 수많은 우수한 오픈 소스 라이브러리가 go mod
로 전환되었습니다. 이는 세계를 통합할 수 있는 잠재력을 가지고 있습니다go get
命令,可以直接获取对应的依赖,非常方便,但是有一个巨大的缺陷,没有版本的维护和管理,而版本不一致可能会导致各种兼容性问题,因此出现了很多第三方依赖管理工具,dep
和 glide
就是其中的佼佼者,到了 go 1.11 官方终于推出了自己的依赖管理工具 mod
,并内置在 go 版本中,go mod
使用简单,功能强大,并且能自动兼容大多数之前的第三方工具,大量优秀的开源库都已经切换到了 go mod
,大有一统江湖之势
GO111MODULE
一个最大的变化是 golang 的项目终于不再依赖 $GOPATH
目录了,之前的项目由于 import
机制问题,所有项目都位于 $GOPATH/src
目录下,虽然也没有太大的问题,但总是让人感觉很怪,go 1.11 终于调整了这个问题,将代码从 $GOPATH
中迁出了,为了兼容之前研发模式,也仍然支持放到 $GOPATH
下,通过 GO111MODULE
环境变量控制
-
GO111MODULE=off
: 关闭 mod,查找vendor
目录和$GOPATH
路径下的依赖 -
GO111MODULE=on
: 开启 mod, 仅根据go.mod
下载和查找依赖 -
GO111MODULE=auto
: 默认值,在非$GOPATH
路径并且包含go.mod
的项目中才开启 mod
主要命令
go mod init # 在新的 go 项目中执行,自动分析依赖,创建 go.sum go mod tidy # 自动分析依赖,并自动添加和删除依赖 go mod vendor # 创建 vendor 目录,将依赖拷贝到当前的 vendor 文件夹下 go mod download # 手动下载依赖
- 对于一个新的 go 项目,只需要新建项目的时候执行一下
go mod init
- 之后每次库更新,只需要先在代码中 import 对应库,然后执行
go mod tidy
即可(也可用go mod download
手动下载)
库版本更换
手动修改 go.mod
文件中的 require 字段,重新执行 go mod tidy
即可
require ( github.com/gin-gonic/gin v1.4.0 )
golang 的版本使用以 v
开头的三位版本号,其中第一位表示有重大本本的更新,当发布一个 v2+
版本的库时,module my-module
应该改为 module my-module/v2
,否则引入该库需要在增加 +incompatible
后缀
require ( github.com/lestrrat-go/file-rotatelogs v2.2.0+incompatible )
解决 GFW 问题
因为一些原因,国内的网络访问不到 golang.org 上的库,好在大部分库在 github 上都有镜像,可以用 replace
命令设置镜像,下面是我碰到的一些库
replace ( cloud.google.com/go => github.com/googleapis/google-cloud-go v0.0.0-20190603211518-c8433c9aaceb go.etcd.io/bbolt => github.com/etcd-io/bbolt v1.3.4-0.20191001164932-6e135e5d7e3d go.uber.org/atomic => github.com/uber-go/atomic v1.4.1-0.20190731194737-ef0d20d85b01 go.uber.org/multierr => github.com/uber-go/multierr v1.2.0 go.uber.org/zap => github.com/uber-go/zap v1.10.1-0.20190926184545-d8445f34b4ae golang.org/x/crypto => github.com/golang/crypto v0.0.0-20190605123033-f99c8df09eb5 golang.org/x/exp => github.com/golang/exp v0.0.0-20190510132918-efd6b22b2522 golang.org/x/image => github.com/golang/image v0.0.0-20190523035834-f03afa92d3ff golang.org/x/lint => github.com/golang/lint v0.0.0-20190409202823-959b441ac422 golang.org/x/mobile => github.com/golang/mobile v0.0.0-20190607214518-6fa95d984e88 golang.org/x/net => github.com/golang/net v0.0.0-20190606173856-1492cefac77f golang.org/x/oauth2 => github.com/golang/oauth2 v0.0.0-20190604053449-0f29369cfe45 golang.org/x/sync => github.com/golang/sync v0.0.0-20190423024810-112230192c58 golang.org/x/sys => github.com/golang/sys v0.0.0-20190602015325-4c4f7f33c9ed golang.org/x/text => github.com/golang/text v0.3.2 golang.org/x/time => github.com/golang/time v0.0.0-20190308202827-9d24e82272b4 golang.org/x/tools => github.com/golang/tools v0.0.0-20190608022120-eacb66d2a7c3 google.golang.org/api => github.com/googleapis/google-api-go-client v0.6.0 google.golang.org/appengine => github.com/golang/appengine v1.6.1 google.golang.org/genproto => github.com/google/go-genproto v0.0.0-20190605220351-eb0b1bdb6ae6 google.golang.org/grpc => github.com/grpc/grpc-go v1.21.1 )
GO 1.12 之后支持了一个新的环境变量 GOPROXY,用来设置依赖的代理地址,有两个共用的地址:社区的 goproxy.io
和又拍云的 goproxy.cn
,亲测好用
export GO111MODULE=on export GOPROXY=https://goproxy.io
缓存
go mod 更新依赖后会在本地缓存,缓存路径 $GOPATH/pkg/mod
IDE 支持
goland
启用 mod 配置
【Goland】→【Preference】→【Go Module (vgo)】→ 【Enable Go Modules (vgo)】→ 【OK】
启用 mod 之后,goland 会自动检查依赖,并自动更新 go.sum,从而引入依赖库,一般情况下都是好使的,偶尔不好使,手动执行下 go mod tidy
即可
vscode
vscode 好像不会自动更新,手动执行 go mod tidy
$GOPATH
디렉토리에 의존하지 않는다는 것입니다. code>import 메커니즘이 있기 때문에 이전 프로젝트는 모두 $GOPATH/src
디렉터리에 있었습니다. 큰 문제이긴 하지만 Go 1.11에서는 마침내 이 문제가 조정된 것 같습니다. 이전 개발 모델과의 호환성을 위해 $GOPATH
아래에 코드를 넣는 것을 지원하며 를 통해 제어합니다. >GO111MODULE
환경 변수-
GO111MODULE=off
: 모드를 닫고$GOPATH
에서vendor
디렉토리와 종속성을 검색합니다. > 경로 -
GO111MODULE=on
: 모드를 활성화하고go.mod
를 기반으로 하는 종속성만 다운로드하고 찾습니다. -
GO111MODULE=auto
: 기본값 value, mod만 활성화
rrreee
main command