go的基本概念
gopath,goroot
简单理解GOROOT 是go的安装目录。
执行go env就可以看到gopath与其goroot
GOPATH
- 允许多个目录,当有多个目录时,请注意分隔符,多个目录的时候,在Mac和Linux下通过”:”分割;Windows是分号;
- 当有多个GOPATH时默认将go get获取的包存放在第一个目录下
- $GOPATH目录约定有三个子目录
- src:存放源代码(比如:.go .c .h .s等) 按照golang默认约定,go run,go install等命令的当前工作路径(即在此路径下执行上述命令)
- pkg:编译时生成的中间文件(比如:.a) golang编译包时。
- bin:编译后生成的可执行文件(在项目内执行go install,会把执行文件安装到bin目录)(为了方便,可以把此目录加入到PATH 变 量 中 , 如 果 有 多 个 gopath , 那 么 使 用 PATH 变量中,如果有多个gopath,那么使用PATH变量中,如果有多个gopath,那么使用{GOPATH//?/bin:}/bin添加所有的bin目录
go install xxx 生成的可执行文件,会在gopath的bin目录里面,将其复制到goroot的bin目录中可供全局使用
使用
目前调研,网上大致分为三种流派, 每个流派的使用方式各有利弊。
- 第一种:全局一个gopath,第三方库和项目源码都放在同一个gopah。采用github管理源码(公司内部采用git.code平台) + glide(go 包管理工具)管理依赖包。
- 优点:路径只有一个,足够简单,所有项目代码一目了然,阅读方便,采用glide实现版本依赖管理,解决了第三方依赖包升级冲突的问题。
- 缺点:项目之间的依赖不隔离,容易错误引用到不希望的依赖。 业务代码与第三方依赖包代码在同一个目录,不美观。
- 第二种:只有两个gopath,第一个gopath存放第三方依赖包, 第二个gopath存放业务项目。 项目依赖管理同样可使用glide解决。
- 第三种:每个项目有自己专属的gopath。优点是项目在任意目录下都能编译成功,项目之间无任何依赖。 缺点是如今是微服务的潮流,一个大型项目下会拆分成n个子项目,这样会导致gopath内轻轻松松就超过几十个项目路径。 解决办法是在每个项目中起一个build.sh脚本,执行build.sh脚本,先动态设置当前项目目录到gopath,然后才执行go build,这样项目copy到任意目录都能编译通过。
goroot
go的安装目录,其bin目录下的可执行文件可供全局使用,例如goimports,gofmt
go module
go module
将是Go语言默认的依赖管理工具。
go mod 常用命令
go mod download 下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit 编辑go.mod文件
go mod graph 打印模块依赖图
go mod init 初始化当前文件夹, 创建go.mod文件
go mod tidy 增加缺少的module,删除无用的module
go mod vendor 将依赖复制到vendor下
go mod verify 校验依赖
go mod why 解释为什么需要依赖
go mod 的详细介绍 https://zhuanlan.zhihu.com/p/59687626