go get 从远程获取安装包
go get
命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装。整个过程就像安装一个 App 一样简单。
这个命令可以动态获取远程代码包,目前支持的有 BitBucket、GitHub、Google Code 和 Launchpad。在使用 go get
命令前,需要安装与远程包匹配的代码管理工具,如 Git、SVN、HG 等,参数中需要提供一个包名。
go get
这个命令会分两步走,一个是下载源码包,一个是执行go install
。如果包里面有main包的时候,下载完源码包就可以被go install
编译放在GOPATH/bin
目录下。
常用参数
- -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@指定的version
, go.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已经默认开启
export GO111MODULE=off # 关闭go mod
export GO111MODULE=on # 开启go mod
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非常慢
export GOPROXY=https://mirrors.aliyun.com/goproxy/ #设置拉取的代理
export GOPROXY=file://本地路径 # 也可以从本地加载
go mod下载的包不对, 可下面的命令下载指定的版本
如果发现编译不过,可以通过下面命令列出指定mod的版本,然后go get拉指定版本号的包
go list -m -versions rsc.io/sampler
go get rsc.io/sampler@v1.3.1
1.13可以彻底不要GOPATH了
go mod 会贯穿go tool工具链,这句话什么意思呢,意思是go test, go vet, go build等工具都会先检查依赖。go mod会自动工作。如果你依赖没有下载好,则会一直卡住。
go mod init # 初始化当前目录为模块根目录,生成go.mod, go.sum文件
go mod download # 下载依赖包
go mod tidy # 整理检查依赖,如果缺失包会下载或者引用的不需要的包会删除
go mod vendor # 复制依赖到vendor目录下面
go mod graph # 显示依赖结构图
go mod # 可看完整所有的命令