GOROOT,GOPATH,GOVENDOER

区别于使用

Posted by KL on August 18, 2018

GOPATH与GOROOT

在工作过程中,经常碰到GOPATH与GOROOT设置引起的环境变量错误,所以总结下它们的区别于用法。 可以通过 go env 查看下当前机器的环境变量有哪些 ```!571 $ go env GOARCH=”amd64” GOBIN=”” GOEXE=”” GOHOSTARCH=”amd64” GOHOSTOS=”darwin” GOOS=”darwin”


Stack Overflow上有个讨论特别有用 https://stackoverflow.com/questions/7970390/what-should-be-the-values-of-gopath-and-goroot
下面的例子可以说明问题

directory for go related things: ~/programming/go directory for go compiler/tools: ~/programming/go/go-1.4 directory for go software : ~/programming/go/packages

GOROOT, GOPATH, PATH are set as following:

export GOROOT=/home/user/programming/go/go-1.4 export GOPATH=/home/user/programming/go/packages export PATH=$PATH:$GOROOT/bin:$GOPATH/bin


### About GOROOT
你的go可执行文件安装到了哪里,默认在 `/usr/local/go`。
支持自定义安装golang位置,详情可参考官方文档https://golang.org/doc/install#install
有一点需要注意 `GOROOT must be set only when installing to a custom location`
> 只有当你把go安装到了自定义的位置的时候,必须设置GOROOT的位置,否则会出现一些奇怪的错误,比较fmt,runtime包找不到之类的.

> 同时,在开发项目的过程中,切记不要胡乱设置GOROOT,原因同上

### Abouht GOPATH
官方定义如下

The GOPATH environment variable specifies the location of your workspace. It defaults to a directory named go inside your home directory, so $HOME/go on Unix, $home/go on Plan 9, and %USERPROFILE%\go (usually C:\Users\YourName\go) on Windows.

If you would like to work in a different location, you will need to set GOPATH to the path to that directory. (Another common setup is to set GOPATH=$HOME.) Note that GOPATH must not be the same path as your Go installation.

简单而言:哪里去找到你的go项目,如果不指定,默认在 `$HOME/go`,有时会碰到一个常见的错误是 `GOPATH must not be the same path as your Go installation`, 开发项目的过程中可以注意下,如果这个错误出现,一般就是因为GOROOT设错了,或者不应该设。

GOPATH的设置与go项目的目录结构直接相关,所以先了解下golang一个项目的目录结构,参见go dochttps://golang.org/cmd/go/#hdr-GOPATH_environment_variable ,典型项目结构如下

GOPATH=/home/user/go

/home/user/go/ src/ foo/ bar/ (go code in package bar) x.go quux/ (go code in package main) y.go bin/ quux (installed command) pkg/ linux_amd64/ foo/ bar.a (installed package object) vendor/ (go get package location) golang.org github.com

有一个更详细的how to start a go project 可以看这个文档 https://golang.org/doc/code.html#Introduction

### About GO GET and import package
#### import remote repo
https://golang.org/doc/code.html 能看到如下描述

```If you include the repository URL in the package's import path, go get will fetch, build, and install it automatically```
go get = got fetch + go build + go install

$ go get github.com/golang/example/hello $ $GOPATH/bin/hello Hello, Go examples!

如果要go get hello 这个github的package,go程序首先会去 `$GOPATH/src/github.com/golang/example/hello ` 找package,如果能找到,go get会skip `go fetch`步骤。

#### import local project repo
以上面golang项目结构为例:
`y.go` 属于main packge, `x.go` 属于 bar package,如果y.go要引用x.go里面的代码,需要做的就是在`y.go`代码里面
`import foo/bar`
一个目录一般只有一个package,import的时候不需要写绝对路径,go程序自动回去$GOPATH下面去找

### About GO_VENDOR
go vendor 是一个第三方golang包管理工具,可以查询项目用到的依赖包,查看,更新依赖包的版本 https://github.com/kardianos/govendor
安装 `go get -u github.com/kardianos/govendor`
常用命令如下,完整的文档参见github主页

Setup your project.

cd $GOPATH govendor init

Add existing GOPATH files to vendor.

govendor add +external

View your work.

govendor list

Look at what is using a package

govendor list -v fmt

Specify a specific version or revision to fetch

govendor fetch golang.org/x/net/context@a4bbce9fcae005b22ae5443f6af064d80a6f5a55 govendor fetch golang.org/x/net/context@v1 # Get latest v1.. tag or branch. govendor fetch golang.org/x/net/context@=v1 # Get the tag or branch named “v1”.

Update a package to latest, given any prior version constraint

govendor fetch golang.org/x/net/context

Format your repository only

govendor fmt +local

Build everything in your repository only

govendor install +local

Test your repository only

govendor test +local ```