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")
的方式引用该包了。