本篇博客来自于
Go语言介绍
golang官方1
golang官方2
GOPATH 是golang 中的一个环境变量,了解它对了解整个golang项目的组织方式很有帮助,同时很多go 命令也会默认用到 GOPATH,所以必须牢固掌握。
原文如下:
The GOPATH environment variable is used to specify directories outside of $GOROOT that contains the source for Go progects and theire binaries.
介绍:
GOPATH 环境变量是用来指定GOROOT之外的,包含项目的源文件和他们的二进制文件的目录。
也就是说:你的项目的源代码文件(.go文件) 和 二进制文件(:package 和 可执行文件) 都会放在GOPATH下面。 因为整个工程斗放在$GOPATH下面,所以 go 工具(比如 go install) 将会对GOPATH 下面的内容进行查找。比如 二进制的目的地,搜索 imports 的地址。
GOPATH 是一个 路径列表,指定的多个目录由 “:” 分隔,(OS X 或者Linux)或者 “;”分隔(Windows上面)。
当多个目录列出的时候, go install 或者 “go 工具” 以外的任何地方使用,第一个目录作为安装目录。 当在GOPATH的路径列表内使用这两种工具的时候,包含目录作为安装目录。(这个在下文中的例子中会存在)
对于本文档的大部分内容, $GOPATH 表示 指向路径列表中当前活动的第一个。
设置GOROOT(使用全局设置,在/etc/..中)
export GOROOT=/usr/local/go
export PATH=$PATH: $GOROOT/bin
使其生效
source /etc/profile
编辑当前用户的环境变量
vim ~/.bashrc
设置 GOPOAH
export GOPATH=$HOME/p/ext:$HOME/p/dev
是其生效
source ~/.bashrc
此处设置了 GOPATH 为两个目录(一个用于存放第三方包,一个用户开发),如果使用 go 工具
进行第三方包的安装
go get code.google.com/p/go-tour/gotour
默认会安装到第一个目录 ($HOME/p/ext
)
如果在$HOME/p/dev
中写代码,使用 go工具(go install
,go build
) 会将二进制包安装到 $HOME/p/dev
中。
集成 GOPATH
在 OS X 或者 Linux中,加入下面的表达式到 PATH中,将会加入所有的 $GOPATH/bin
目录。
$(GOPATH//://bin:)/bin
添加如下语句到 标准 Go makefile中 将引入所有的 $GOPATH 的pkg 目录
`GOPATHSEP=:
ifeq ($(GOHOSTOS),windows)
GOPATHSEP=;
endif
GCIMPORTS+=-I $(subst $(GOPATHSEP),/pkg/$(GOOS)_$(GOARCH) -I,$(GOPATH))/pkg/$(GOOS)_$(GOARCH)
LDIMPORTS+=-L $(subst $(GOPATHSEP),/pkg/$(GOOS)_$(GOARCH) -L,$(GOPATH))/pkg/$(GOOS)_$(GOARCH)
目录布局
导入 目录为 x/y/z的包的源文件在目录 (注意导入的包的名称)
$GOPATH/src/x/y/z
导入目录为 x/y/z的包的二进制文件在 (注意生成的 包的名称 )
$GOPATH/pkg/x/y/z.a
源文件位于 $GOPATH/src/A/B
的 命令 的二进制文件在 (注意生成的命令的名称)
$GOPATH/bin/B
仓库集成 和 创建 go install
项目
go install
,当获取一个包,根据包的导入路径如发现URL。如果尝试
go install code.google.com/p/gomatrix/matrix
go install
将从 http://code.google.com/p/gomatrix 取得源代码,并且将它克隆到仓库
$GOPATH/src/code.google.com/p/gomatrix
若你想在你的自己的代码仓库中 “import a package” 你需要使用这个package的 “full import path”。也就是说,如果你想导入 “matrix” 这个包,你需要
import "code.google.com/p/gomatrix/matrix"
而不是
import "matrix"
(需要使用全名)
技巧和窍门
第三方包
GOPATH设置两个目录很有用。第一个目录作为第三方包的存放位置,第二个目录作为你自己的项目。 将第三方的GOPATH放置到第一位,这样子 go install 将使用它作为默认的位置。 然后你可以在第二个 GOPATH目录下工作,并且可以使用 go 命令
(在第二个GOPATH西面使用 go 命令), go install
等。
举例:
上例中设置的 两个目录中,目录结构如下:
.
--p
–linux_amd64
|--ext
| |--bin # 命令目录
| |--pkg # 包目录
| |
| |--github.com
–src # 源码目录
|
|--github.com
–… # 源码子目录
|
--dev
–src
|--bin
|--pkg
FAQ
为什么 $GOPATH/src/cmd/mycmd/*.go
没有编译?
当使用 go 命令 搜素包的时候,它总是首先搜索 $GOROOT
。 $GOROOT
中包含目录,当它在 $GOROOT
中找到一个 cmd/
目录的时候 它不会继续寻找 any of the GOPATH directories.
这样可以防止你 定义你自己的 math/matrix
和 cmd/mycmd
的包。
(也就是顶级目录不能和 $GOROOT
下面的目录相同)。