GOPATH 深度解析

xiaorenwuzyh · · 4953 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

本篇博客来自于
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
|--ext
| |--bin # 命令目录
| |--pkg # 包目录
| |
–linux_amd64
| | --github.com
|
–src # 源码目录
| --github.com
|
–… # 源码子目录
--dev
|--bin
|--pkg
–src

FAQ

为什么 $GOPATH/src/cmd/mycmd/*.go 没有编译?
当使用 go 命令 搜素包的时候,它总是首先搜索 $GOROOT$GOROOT中包含目录,当它在 $GOROOT 中找到一个 cmd/目录的时候 它不会继续寻找 any of the GOPATH directories.
这样可以防止你 定义你自己的 math/matrixcmd/mycmd的包。

(也就是顶级目录不能和 $GOROOT 下面的目录相同)。


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:xiaorenwuzyh

查看原文:GOPATH 深度解析

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4953 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传