@aliasliyu4
2017-02-14T07:47:12.000000Z
字数 5558
阅读 9569
build != complie
-a 构建一个项目意味着更多比编译你的代码
-b 静态分析,lint检查,安装,配置,打包......
项目的各个阶段都有相同的工具
-a Makefiles作为胶水的角色连接 起go编译链(build, install, clean)
-b 同时也可以使用第三方工具(go lint, go vet, gb, 等等......)
不确定语言
-a 有可能你的项目可能不止依赖仅仅一种语言
-b 生成配置文件,指导页,固定数据等等......
可以在多个平台上使用
-a 用户可以选择任何他想用的系统
-b 夸平台编译
code to build
package mainimport "fmt"func main() {// Probably the most awesome piece of code you've ever seen.fmt.Println("i love you!")}
Makefile
default:go build
Run
# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [13:24:29]→ ls -altotal 16drwxr-xr-x 4 aliasliyu4 staff 136 Feb 14 13:24 .drwxr-xr-x 23 aliasliyu4 staff 782 Feb 14 13:22 ..-rw-r--r-- 1 aliasliyu4 staff 21 Feb 14 13:23 Makefile-rw-r--r-- 1 aliasliyu4 staff 134 Feb 14 13:23 main.go# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [13:24:31]→ makego build# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [13:24:32]→ lsMakefile gomake main.go# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [13:24:34]→ ./gomakei love you!# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [13:24:36]→
编译: 输入:"make"
你也可以编译多个项目在单个Makefile中。
-a 一个Makefile可以调用另一个Makefile
想要在你的代码中使用更多复杂的工具?
-a 构建一个项目的所有脚本和数据都属于它本身
-b 如果有你不想持续集成的部分,只需要改变你的Makefile
安装: 输入:"make install"
清理: 输入:"make clean"
Improved Make file
# Default target: builds the projectbuild:go build# Installs our project: copies binariesinstall:go install# Cleans our project: deletes binariesclean:go clean
Run
# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [13:51:49]→ ls -altotal 16drwxr-xr-x 4 aliasliyu4 staff 136 Feb 14 13:51 .drwxr-xr-x 23 aliasliyu4 staff 782 Feb 14 13:22 ..-rw-r--r-- 1 aliasliyu4 staff 175 Feb 14 13:50 Makefile-rw-r--r-- 1 aliasliyu4 staff 134 Feb 14 13:23 main.go# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [13:51:53]→ makego build# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [13:51:57]→ lsMakefile gomake main.go# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [13:52:05]→ ./gomakei love you!# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [13:52:14]→ make cleango clean# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [13:52:20]→ lsMakefile main.go
Improved source code
package mainimport "fmt"// Variables to identify the buildvar (Version = "1.0.0"Build = "2017-02-14")func main() {fmt.Println("Version: ", Version)fmt.Println("Build time: ", Build)}
Improved Makefile
# This how we want to name the binary outputBINARY=gomake# Builds the projectbuild:go build -o ${BINARY}# Installs our project: copies binariesinstall:go install# Cleans our projects: deletes binariesclean:if [ -f ${BINARY} ] ; then rm ${BINARY} ; fi.PHONY: clean install
Run
# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [14:22:46]→ ls -altotal 16drwxr-xr-x 4 aliasliyu4 staff 136 Feb 14 14:22 .drwxr-xr-x 23 aliasliyu4 staff 782 Feb 14 13:22 ..-rw-r--r-- 1 aliasliyu4 staff 292 Feb 14 14:22 Makefile-rw-r--r-- 1 aliasliyu4 staff 203 Feb 14 14:03 main.go# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [14:22:49]→ makego build -o gomake# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [14:22:51]→ ls -altotal 3152drwxr-xr-x 5 aliasliyu4 staff 170 Feb 14 14:22 .drwxr-xr-x 23 aliasliyu4 staff 782 Feb 14 13:22 ..-rw-r--r-- 1 aliasliyu4 staff 292 Feb 14 14:22 Makefile-rwxr-xr-x 1 aliasliyu4 staff 1603664 Feb 14 14:22 gomake-rw-r--r-- 1 aliasliyu4 staff 203 Feb 14 14:03 main.go# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [14:22:54]→ ./gomakeVersion: 1.0.0Build time: 2017-02-14# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [14:22:58]→ make cleanif [ -f gomake ] ; then rm gomake ; fi# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [14:23:04]→ ls -altotal 16drwxr-xr-x 4 aliasliyu4 staff 136 Feb 14 14:23 .drwxr-xr-x 23 aliasliyu4 staff 782 Feb 14 13:22 ..-rw-r--r-- 1 aliasliyu4 staff 292 Feb 14 14:22 Makefile-rw-r--r-- 1 aliasliyu4 staff 203 Feb 14 14:03 main.go
增加版本号
-a 编辑代码去突出版本号是痛苦的事情。
-b 你很快就会忘记它,提交,然后你的git历史也会断裂
添加构建时间
-a 和上述的版本号问题相似。
-b 使用哪种格式化的时间戳呢?怎么有这么奇怪的字符串?
-c 显然在编译之前也需要一个时钟去检查时间的准确性。
Improved source code
package mainimport "fmt"// Variables to identify the buildvar (Version stringBuild string)func main() {fmt.Println("Version: ", Version)fmt.Println("Build time: ", Build)}
Improved Makefile
# This how we want to name the binary outputBINARY=gomake# These are the values we want to pass for VERSION and BUILDVERSION=1.0.0BUILD=`date +%FT%T%z`# Setup the -Idflags options for go build here,interpolate the variable valuesLDFLAGS=-ldflags "-X main.Version=${VERSION} -X main.Build=${BUILD}"# Builds the projectbuild:go build ${LDFLAGS} -o ${BINARY}# Installs our project: copies binariesinstall:go install ${LDFLAGS}# Cleans our projects: deletes binariesclean:if [ -f ${BINARY} ] ; then rm ${BINARY} ; fi.PHONY: clean install
Run
# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [14:59:14]→ ls -altotal 3152drwxr-xr-x 5 aliasliyu4 staff 170 Feb 14 14:59 .drwxr-xr-x 23 aliasliyu4 staff 782 Feb 14 13:22 ..-rw-r--r-- 1 aliasliyu4 staff 562 Feb 14 14:59 Makefile-rwxr-xr-x 1 aliasliyu4 staff 1603728 Feb 14 14:58 gomake-rw-r--r-- 1 aliasliyu4 staff 192 Feb 14 14:53 main.go# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [14:59:17]→ makego build -ldflags "-X main.Version=1.0.0 -X main.Build=`date +%FT%T%z`" -o gomake# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [14:59:18]→ ./gomakeVersion: 1.0.0Build time: 2017-02-14T14:59:18+0800# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [14:59:23]→ make cleanif [ -f gomake ] ; then rm gomake ; fi# aliasliyu4 at alialliyu4.local in ~/svn/src/gomake [14:59:28]→ ls -altotal 16drwxr-xr-x 4 aliasliyu4 staff 136 Feb 14 14:59 .drwxr-xr-x 23 aliasliyu4 staff 782 Feb 14 13:22 ..-rw-r--r-- 1 aliasliyu4 staff 562 Feb 14 14:59 Makefile
使用LDFLAGS
-a go链接命令允许你去设置字符串变量在编译的时候使用-X选项
-b 使用格式化:importpath.name=value
golang1.5+和之前版本的不同
-a golang1.5+ -X 选项作为一个分隔参数在“k=v”之间
-b 譬如: go build -ldflags "-X main.Version=1.0.0 -X main.Build=2017-02-14"
-c golang < 1.5 -X选项后面跟着两个分隔的参数
-d 譬如: go build -idflags "-X main.Version 1.0.0 -X main.Build 2017-02-14"