go get 从远程获取安装包

go get 命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装。整个过程就像安装一个 App 一样简单。

这个命令可以动态获取远程代码包,目前支持的有 BitBucket、GitHub、Google Code 和 Launchpad。在使用 go get 命令前,需要安装与远程包匹配的代码管理工具,如 Git、SVN、HG 等,参数中需要提供一个包名。

go get这个命令会分两步走,一个是下载源码包,一个是执行go install。如果包里面有main包的时候,下载完源码包就可以被go install编译放在GOPATH/bin目录下。

go命令 - 图1

常用参数

  • -d 下载包后不安装
  • -f 只有包含了 -u 参数的时候才有效,不去验证import 中的每一个已经获取的包,这对于本地 fork 的包特别有用
  • -fix 在获取源码之后先运行 fix,然后再去做其他的事情
  • -insecure 允许使用不安全的 HTTP 方式进行下载操作
  • -t 同时也下载需要为运行测试所需要的包
  • -u 获取安装包及其依赖,默认情况下使用网络去更新丢失的包,但不去更新已经存在的包
  • -v 打印调试信息

go get 与 go mod 依赖管理

go mod初始化的项目目录下执行go get package,会将package下载到$GOPATH/pkg目录下安装,并且添加或更新到go.mod文件中,当想要修改 package的版本时,只需要go get package@指定的versiongo.mod 也会相应的更新。

go mod项目,执行go get package,只是将package下载到$GOPATH/src/...目录下安装。

go mod

go mod能管理的依赖包的版本,能保证在不同地方构建,获得的依赖模块是一致的。

没有go mod之前如何管理包依赖

没有go mod之前,有go deps, vendor等方法来解决。

go mod如何工作

go 1.11通过设置环境变量GO111MODULE来决定是否启用 go1.13已经默认开启

  1. export GO111MODULE=off # 关闭go mod
  2. export GO111MODULE=on # 开启go mod
  3. export GO111MODULE=auto # GOPATH/src不启用,但是还要看当前目录或者上级目录是否存在go.mod,go.sum,如果存在,则启用go mod

这里面有个坑,就是设置为auto的时候并且在GOPATH/src下,如果该目录或者父目录存在go.mod, go.sum文件,则go mod也是启用的

切换到go mod可能遇到的问题

go mod download非常慢

  1. export GOPROXY=https://mirrors.aliyun.com/goproxy/ #设置拉取的代理
  2. export GOPROXY=file://本地路径 # 也可以从本地加载

go mod下载的包不对, 可下面的命令下载指定的版本

  1. 如果发现编译不过,可以通过下面命令列出指定mod的版本,然后go get拉指定版本号的包
  2. go list -m -versions rsc.io/sampler
  3. go get rsc.io/sampler@v1.3.1

1.13可以彻底不要GOPATH了

go mod 会贯穿go tool工具链,这句话什么意思呢,意思是go test, go vet, go build等工具都会先检查依赖。go mod会自动工作。如果你依赖没有下载好,则会一直卡住。

  1. go mod init # 初始化当前目录为模块根目录,生成go.mod, go.sum文件
  2. go mod download # 下载依赖包
  3. go mod tidy # 整理检查依赖,如果缺失包会下载或者引用的不需要的包会删除
  4. go mod vendor # 复制依赖到vendor目录下面
  5. go mod graph # 显示依赖结构图
  6. go mod # 可看完整所有的命令