您的位置:首页 > 运维架构

GOPATH 深度解析

2015-05-06 09:58 162 查看
本篇博客来自于

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/matrix
cmd/mycmd
的包。

(也就是顶级目录不能和
$GOROOT
下面的目录相同)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: