Golang 工程自管理

 

有用过VS或者Eclipse的同学一定对左边一列(也可能放右边或下边或者隐藏起来)工程目录记忆尤新。 尤其是有一大堆依赖包、库的时候,目录结构更是复杂。其实这都不是大问题。 熟悉自己工程的自然很适应这种结构。但是当大家去看一些C/CPP工程的时候,其目录结构各自不同。 虽然有一些大家都懂的“src/bin/lib”这些目录。但每个工程之间还是各自不同的。 这样在接触他人项目的时候不免会折腾一番。而且当你拥有多个项目的时候。 如果不自己好好安排好他们的地理位置,也会给自己的带来很多麻烦。 还记得小明问你要代码的时候,你在 各个目录之间飞梭寻找的情景么?而这一切在Golang中却得到了有力的保障。 Golang在语言层面(或者说编译器工具层面更合理)规定了一个开发人员的目录结构以及 各类文件的地理位置 ,并且这种管理天生就迎合了开源的思想、迎合了Git、Mercury的管理模式。设想一下。 你在自己的一个固定的目录里面看到 src/github.com/nsf/gocode 会咋想。这还想?不用想都知道 是放在Github上的一个项目,看看Readme里面就知道他干什么了。 另外再也不用Makefile、autotools管理bin文件以及lib文件的位置了。 (这里很多是相对于同样需要编译的C/CPP来说的 ,不喜请绕)。

工程自管理步骤

这里要说的不仅是一个推荐,其中部分也是强制的。比如你可以不用类似github.com/nsf/的目录结构。 但是必须要有bin和src目录。

安装Golang

首先当然还是来安装咱们的Golang。rpm系 yum install golang 一下就结束战斗了, deb系的当然 apt-get install golang一下就搞定。 如果没有联网的话,可以手动去到 http://golang.org 下载tar包回来然后解压即可。这里需要设置下go的bin 目录到PATH中。

export PATH=$PATH:YOUR_GO_DIR/bin/

运行go version 查看下是否能正常看到go的版本信息。如果看到了则说明安装成功了。

安装过JRE/JDK的同学都知道安装完了还要设置JAVA相关的环境变量。那么安装完Golang以后要设置啥 环境变量呢?设置几个呢?看到了上面的版本信息,其实我想说不设置也是可以看到 java -version 的成功信息了。但是。。但是为了更好的符合我们上面的工程自管理的要求,我们还是要设置环境变量, 为了不惹人嫌,Golang仅需要设置一个环境变量即可。他就是GOPATH。通过该变量找到Golang工程的 home目录或者说是工程目录。

GOPATH=YOUR_GO_PROJECT_DIR

这里的 YOUR_GO_PROJECT_DIR 不是上面的 YOUR_GO_DIR,如果你通过软件源安装也没有上面的 YOUR_GO_DIR是不是。这里的YOUR_GO_PROJECT_DIR 就是未来你用Golang写程序放代码的位置。比如 我设置为 ~/projects/golang 。完了以后为了让我们的用Golang写的程序在编译以后可以方便的运行, 而不是cd到某个目录下再./xxx来运行,我们把$GOPATH/bin加入到PAHT环境变量中。当然这也可能 产生乱设PATH的安全一说。但是咱是用Golang做开发,开发机器上自然也就无所谓了,更何况类似 gocode等工具有了这样的设置会更方便操作呢。所以我们也就把他设置上了。

export PATH=$PATH:$GOPATH/bin

好。到这里咱们的基本工作就算完成了。也就是安装好Golang了。等下,既然我们有了$GOPATH, 那么我们的相关目录肯定得建上。依次建上bin和src目录

mkdir -p $GOPATH/src $GOPATH/bin

好了。完美。

编译操作

有了上面的准备,创建了基本的目录并设置好环境变量后就可以开始hello world了(编程的不要说 不知道hello world哦)。 首先把hello world的源码写上。

mkdir -p $GOPATH/src/github.com/you/helloworld
cd $GOPATH/src/github.com/you/helloworld
emacs helloworld.go

package main

import ("fmt")

func main(){
    fmt.Print("Hello World \n")
}

有了源码以后咋编译呢?可以使用cgo,gcc对golang的支持,那样就太自助了,不是我们这里所说 的的的"自我管理"要讲的,这里要讲一个更简便的方法。通过go tools系列工具帮我们完成自动化 管理过程。

首先我们想立刻看下这个程序的结果,那么我们可以

go run helloworld.go

来快速的进行验证。

验证完了以后。我们最终还是要把他编译成二进制文件。这个时候用

go build

就在helloworld.go所在目录下运行。我们会看到当前目录下生成了可执行文件 helloworld

./helloworld

可以看到程序的输出结果。

当发布程序的时候。运行

go install

在 $GOPATH/bin/目录下就会生成对应的文件了。 这里我们可以把 go build 产生的文件当作是debug 版本用于调式,当调式OK后,关调debug log,然后go install 得到发布的版本。

这里一再提到自管理,因为这样在这样的目录格式下,这套工具才有效,而且合理的规范的了源码结构。 虽然在src目录下的结构不是强制的,但是这样按照 "webserver.com/user/project" 的方式看着也不错 而且在想放到github或者bitbucket上的时候。只要cd到相应目录下:

git remote add
git add *
git commit
git push

就可以完成管理。

上面说到了可执行文件的生成。那么怎么生成包呢?

首先要将main函数名替换调,这个和c/cpp ,java一样,入口不能编译到包里面。然后运行

go build/intall

就会在当前目录或者 $GOPATH/pkg/bin_platform/github.com/you/ 目录下生成相应的包了,包为 文件名.a ,go tools默认生成静态库。

之后在其他代码中就可以通过

import("github.com/you/yourpackage")

的方式引用该包了。

posted @ 2014-04-01 17:34  G背包  阅读(2276)  评论(0编辑  收藏  举报