[翻译]Go 环境设置

在最近的 weekly 版本中,golang 已经将大多数操作集成到了 go 这一个工具。并且环境变量的设置也发生了变化。不过蛋疼的是,如果不理解 GOPATH 的真正用法,只会让你蛋碎一地。

最常见的错误:

can't load package: .: path "/pla/pla/pla" not inside a GOPATH

这篇文章,简短、清晰的解释了新的 go 环境应当如何设置。

作者 Frank Müller,原文在此:http://mue.tideland.biz/2012/02/go-environment-setup.html?spref=tw

—————-翻译分隔线—————-

Go 环境设置

对于 Go 环境来说,最好的开始就是设置一个所有目录存放的根目录,例如 /home/themue/projects。它将是 Go SDK、第三方包和自有项目的家目录。当前的 weekly 版本可使用命令将 Go 安装到 hg clone -u weekly https://code.google.com/p/go 安装到 go 目录。 文档 http://weekly.golang.org/doc/install.html 对此逐一进行了详述。另外两个目录只能手工创建,别且都分别创建 srcpkg 子目录。这样就得到了如下结构

/home/themue/projects
        /go
                /bin
                ...
                /test
        /own
                /pkg
                /src
        /3rdparty
                /pkg
                /src

为什么有第三方目录?新的 Go 工具采用非常智能的方式将外部包安装在不同的目录中。这是基于环境变量 $GOPATH 的。名字已经说明这是一个路径,而不仅仅是一个目录。go buildgo install 利用 $GOPATH 寻找软件需要编译和链接的关联包。必须先安装外部包才能使用。命令 go get 将会在路径的第一个目录中安装源代码并且编译包。因此上面例子中,顺序应当为

GOPATH=$HOME/projects/3rdparty:$HOME/projects/own

当源代码安装位于 …/own/src 的自有包时,它将会被安装在 …/own/pkg 中。

还有哪个环境变量是必须的?一个是 $GOROOT。它指向了 Go SDK 的根目录,这里是 /home/themue/projects/go。编译后的可执行文件将会安装在 $GOROOT/bin。不过对于 SDK 会有两个选择进行接下来的设置:

  • 二进制文件存放的位置没有问题。标准的 $PATH 将指向这一目录,像这样 PATH=$PATH:$HOME/projects/go/bin.
  • 另一个办法就是弄一个存放所有个人可执行文件和脚本的目录 $HOME/bin,并且将它设置在 $PATH 中。这样就可以在安装 Go 之前设置 GOBIN=$HOME/bin。那么编译的 Go 执行文件就会安装在 $HOME/bin 中。

在你自己的源代码目录里,可能会需要为了不同的项目用到更多的子目录。它们命名方式可能依赖于你使用的其他软件配置管理环境。我的是 code.google.com。因此对于 Tideland Common Go Library(访问 http://code.google.com/p/tcgl)我将代码放在
…/own/src/code.google.com/p/tcgl。这个项目包含了若干个包,无论是否在同一个项目中,都可以通过 code.google.com/p/tcgl/foo 的方式导入。更重要的是,使用我的代码的人可以更加容易的了解到如何将其作为第三方包获取和导入。

Comments

4 responses to “[翻译]Go 环境设置”

  1. […] 根据《[翻译]Go 环境设置》的提示设置环境变量; […]

  2. wang Avatar
    wang

    为这些环境变量、目录设置纠结了半天,终于找到一篇彻底解惑的文章啦,谢谢分享~

  3. ner Avatar
    ner

    终于找到一编关于环境变量的文章了。谢谢分享。。。
    (想问个问题:第三方包那个是是pkg,还是pkd?或者什么名字都无所谓?)

  4. mikespook Avatar

    pkg,手误了,已更正。谢谢!!

Leave a Reply

Your email address will not be published. Required fields are marked *