1. go get 命令简介
go get 命令用于下载并安装 Go 语言包,它会自动解析导入路径,找到对应的代码库地址,利用 git/hg/svn 等版本控制工具将代码下载并安装到 GOPATH/src 目录。
import "github.com/gin-gonic/gin"
运行 go get github.com/gin-gonic/gin 会自动安装 gin 框架。
命令格式
go get [-d] [-t] [-u] [build flags] [packages]
常用参数说明:
-d:只下载,不安装
-t:同时下载需要为运行测试所需要的包
-u:更新本地已有的包到最新版本
[build flags]:编译参数,用于指定平台、版本等信息
[packages]:自动解析导入路径,安装指定的包
工作原理
go get 命令会自动解析导入路径,找到对应的 git/hg/svn 代码仓库地址,利用版本控制工具将代码下载到GOPATH/src 目录,然后进行自动编译安装。
以安装 gin 为例,会执行以下步骤:
将github.com/gin-gonic/gin 转化为 github.com/gin-gonic/gin 代码仓库地址
使用 git 克隆 github.com/gin-gonic/gin 仓库到 GOPATH/src 目录
对下载的代码进行编译安装
将安装信息写入依赖管理文件 go.mod
所以使用 go get 前需要确保环境中已经安装好 git/hg/svn 等工具。
2. go get 命令详解
go get 命令功能强大,提供了丰富的功能来安装 Go 语言包。
2.1 下载最新版本代码
直接使用 go get 包路径 会下载最新的 master/trunk 分支代码
$ go get github.com/gin-gonic/gin
这就获取了 gin 框架最新的开发版本。
2.2 下载指定版本代码
使用 @版本号 可以下载指定版本代码
$ go get github.com/gin-gonic/gin@v1.8.1
这会下载 v1.8.1 版本的 gin。
也可以使用 commit id
$ go get github.com/gin-gonic/gin@e2212d88b18a
commit id 需要在仓库提交记录中查找。
2.3 更新已安装的包
对于已安装的包,使用 -u 参数可以将其更新到最新版本
$ go get -u github.com/gin-gonic/gin
这会将本地 gin 包更新到最新的 master/trunk 代码。
2.4 安装私有仓库的包
有时候会将代码仓库托管在私有 Gitlab/SVN 等仓库,这时直接使用导入路径是不行的,需要指定仓库地址
$ go get gitlab.com/orgname/reponame$ go get svn.internal.com/svn/proj/trunk
注意不同的版本控制工具使用的协议和地址格式有所差异。
2.5 将依赖下载到 vendor 目录
默认情况下, go get 只会下载目标包的代码,而不会下载其依赖。
使用 -v 参数可以在下载包的同时也下载其依赖:
$ go get -v github.com/gin-gonic/gin
这会将 gin 及其所有依赖也下载下来,存储在 vendor 目录中。
2.6 避免自动安装推荐的包
有些包代码中会通过注释的方式推荐用户安装其他相关包,使用 -d 参数可以避免这种自动安装
$ go get -d github.com/gin-gonic/gin
这就只下载 gin 包,而不会下载其推荐的其他包。
3. go get 命令的常见用法
go get 命令功能强大,在团队项目开发中有很多常见用法。
3.1 初始化新项目
利用 go get 可以一步初始化新项目
$ mkdir myapp$ cd myapp$ go mod init github.com/mouday/myapp$ go get github.com/gin-gonic/gin$ tree.├── go.mod└── src └── github.com └── mouday └── myapp
这就创建了一个依赖 gin 的新项目。
3.2 安装依赖包
在代码中导入需要的包后,可通过 go get 安装依赖
import ( "github.com/gin-gonic/gin" "github.com/go-sql-driver/mysql") $ go get
这会自动解析导入路径,安装这两个依赖包。
3.3 更新依赖包
利用 -u 参数可以轻松更新所有依赖包
$ go get -u
这可以避免依赖包版本过旧带来的问题。
3.4 跨平台编译
指定平台参数,可以编译出适用于不同平台的执行文件
$ go get -v -ldflags "-s -w" \ github.com/go-sql-driver/mysql
常见的平台值包括: linux , windows , darwin 等。
3.5 指定代理镜像
有时候需要通过代理来下载依赖包
$ go env -w GOPROXY=https://goproxy.cn$ go get github.com/gin-gonic/gin
这会通过 goproxy.cn 代理镜像来下载 gin 包。
4. go get 遇到的问题及解决方法
在使用 go get 时也可能碰到一些问题,主要包括
4.1 网络代理及 VPN 导致的下载失败
有时候在公司网络环境下,由于代理或 VPN 的影响,会导致 go get 无法正常工作。
这时可以通过如下办法解决:
$ go env -w GOPROXY=https://goproxy.cn$ go env -w GOSUMDB=off
使用国内代理镜像,并关闭校验和数据库。
4.2 git 仓库访问失败
github 上的仓库访问会失败
package github.com/gin-gonic/gin: unrecognized import path "github.com/gin-gonic/gin"
这是因为无法访问到 git 仓库,需要确保网络畅通或者使用代理。
4.3 SSH keys 配置错误
访问私有 git 仓库有时候需要基于 SSH 协议和密钥认证
go get gitlab.company.com/pkg/tools# ERROR: repository access denied
这时需要确认 ~/.ssh 目录下有对应的私钥配置,并添加到 SSH agent 中。
4.4 vendor 目录冲突
若项目中已经存在 vendor 目录,再次 go get 时会提示冲突
go get: vendor/cache/download failed: rename [...]: file exists
需要先删除 vendor 目录,或者使用 -mod=readonly 参数来避免更新 vendor。
5. 总结
go get 命令在 Go 语言开发中非常重要,有效利用可以提高效率。
go get 工具简化了依赖管理,可以通过简单一条语句完成包的下载和安装。这对团队协作非常重要。
go get 需要依赖 go modules 来记录依赖关系,进行版本选择等。所以要充分结合使用。
Go 语言生态正在快速发展, go get 命令也在不断优化和完善,相信会变得越来越好用。