gsmake —— golang版gradle
什么是gsmake
gsmake是一个类似于gradle的自动构建工具,使用go语言开发:
- gsmake是一个包管理/下载工具;
- 每个包有它全局唯一的包名,以及版本号;
- 包可以定义一系列的任务(task),任务支持由golang语言编写;
- 包可以相互引用,但是不能出现引用环;
- gsmake能够容易的执行包定义的任务;
通过上面描述不难看出,gsmake不仅仅可以用替代make管理golang代码。通过编写一系列插件 支持c/c++工程管理也是可行的,甚至你用它来编写一本《gsmake入门》的书也是有可能的这个 例子在介绍maven/gradle的时候经常提到,总之一句话你可以把它想象成maven/gradle的golang 实现版。
为啥重新发明轮子
- 程序员通病,自己的轮子还是要更圆些;
- 我们的大golang自己的包管理工具,不支持版本化;有一些三方的库例如:gopm 试图解决这个问题,但是我觉得解决得还不够好;
- 基于jvm的maven/gradle太重量级了,一个jvm就要200M;
- 去中心化——maven/gradle需要中心仓库——gsmake不需要, 理论上可以将包托管在任何代码托管网站;现阶段支持下列常用网站:github/bitbucket/gopkg.in
gsmake是怎么工作的?
gsmake一般工作流程如下:
由于golang是一个编译型语言所以需要一个编译的过程,将上一步生成的task调用粘合剂代码与用户 定义的task代码一起编译为一个程序,然后运行之;
task
task具有以下属性
- task名称全局有效;
- task之间可以有由来关系,但是不能出现环;
- 不同包定义的task可以有相同的名称,以及不同的前置依赖task;
- gsmake将不同包但相同名称的task任务看做同一个task的多个执行体;
gsmake接收一个task名称并执行它——在内部gsmake需要一个任务排序的过程。被依赖的task需要先执行:
通过上面的描述我们知道,用户定义的task组成了一个有向无环图,我们知道对于这种数据结构的排序其实就是一个简单的拓扑排序的过程,gsmake的这部分实现在这里
安装
golang的开发环境是必备的,这里就不累述了:
- go get github.com/gsmake/gsmake/cmd/gsmake,这一步将安装一个临时的gsmake可执行 文件到${GOPATH}/bin目录下,不要忘记添加该路径到系统PATH
- 进入${GOPATH}/src/github.com/gsmake/gsmake,执行./gsmake setup ${安装目录}
- 进入比较长的等待——通过gsmake再一次编译gsmake本身,并通过setup任务安装gsmake, 这是一个自举的过程。自此我们就可以丢开gopath,以及golang的版本陷阱愉快的玩耍了。
一个简单的示例
看gsmake项目本身吧,它会自己管理自己:)猛戳这里!!!!! PS:请忽略我的英文readme.md,你懂得:)