golang使用总结:GOPATH和GOROOT区别,GOPATH 需要配置多个吗?

此文章待解决的问题:

  1. GOPATH和GOROOT区别?
  2. GOPATH 需要配置多个吗?

问题1:GOPATH和GOROOT区别?

可以简单理解为:

$GOPATH 是go的工程目录

TENCENT64: 14:31 ~/golearn/go_proj > echo $GOPATH
/data/home/user/golearn/go_proj/
TENCENT64: 14:31 ~/golearn/go_proj > cd /data/home/user/golearn/go_proj/
TENCENT64: 14:31 ~/golearn/go_proj > tree -L 1
.
|-- bin
|-- pkg
`-- src

$GOROOT 是go的安装目录

TENCENT64: 14:34 ~/golearn/go_proj > echo $GOROOT
/usr/local/go
TENCENT64: 14:34 ~/golearn/go_proj > cd /usr/local/go
TENCENT64: 14:35 /usr/local/go > tree -L 1
.
|-- api
|-- AUTHORS
|-- bin
|-- blog
|-- CONTRIBUTING.md
|-- CONTRIBUTORS
|-- doc
|-- favicon.ico
|-- lib
|-- LICENSE
|-- misc
|-- PATENTS
|-- pkg
|-- README.md
|-- robots.txt
|-- src
|-- test
`-- VERSION

可执行go env查看go的所有配置信息:

jameszhou@TENCENT64: 14:42 ~/golearn/go_proj/src > go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/data/home/user/golearn/go_proj/"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build189212099=/tmp/go-build"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"

细节备忘:

  • 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目录)(为了方便,可以把此目录加入到 P A T H 变 量 中 , 如 果 有 多 个 g o p a t h , 那 么 使 用 PATH 变量中,如果有多个gopath,那么使用 PATHgopath使{GOPATH//?/bin:}/bin添加所有的bin目录
  • $GOROOT使用:

    • 首先下载linux下的go包:https://studygolang.com/dl/golang/go1.9.2.linux-amd64.tar.gz
    • 下载之后 tar -zxvf go1.9.2.linux-amd64.tar.gz 解压源码包
    • 移动到 /usr/local/go 也就是GOROOT
  • 在bashrc中配置GOPATH和GOROOT:

export GOPATH=/data/home/user/golearn/go_proj/
export GOROOT=/usr/local/go

问题2:GOPATH 需要配置多个吗?

目前调研,网上大致分为三种流派, 每个流派的使用方式各有利弊。

  • 第一种:全局一个gopath,第三方库和项目源码都放在同一个gopah。采用github管理源码(公司内部采用git.code平台) + glide(go 包管理工具)管理依赖包。
    • 优点:路径只有一个,足够简单,所有项目代码一目了然,阅读方便,采用glide实现版本依赖管理,解决了第三方依赖包升级冲突的问题。
    • 缺点:项目之间的依赖不隔离,容易错误引用到不希望的依赖。 业务代码与第三方依赖包代码在同一个目录,不美观。
  • 第二种:只有两个gopath,第一个gopath存放第三方依赖包, 第二个gopath存放业务项目。 项目依赖管理同样可使用glide解决。
  • 第三种:每个项目有自己专属的gopath。优点是项目在任意目录下都能编译成功,项目之间无任何依赖。 缺点是如今是微服务的潮流,一个大型项目下会拆分成n个子项目,这样会导致gopath内轻轻松松就超过几十个项目路径。 解决办法是在每个项目中起一个build.sh脚本,执行build.sh脚本,先动态设置当前项目目录到gopath,然后才执行go build,这样项目copy到任意目录都能编译通过。

目前组内使用的是第一种和第二种设置方案。

参考资料:

  • 如何使用Go编程:https://go-zh.org/doc/code.html
  • Whats a good best practice with Go workspaces?:https://stackoverflow.com/questions/20722502/whats-a-good-best-practice-with-go-workspaces
  • 大家现在go项目如何管理的?一个项目是一个gopath下的包,还是一个新的gopath?:https://www.zhihu.com/question/47538279
  • Go包管理的前世今生:https://www.ctolib.com/topics-123305.html

你可能感兴趣的:(golang,golang,gopath)