Golang应用程序自动构build版本
每次编译Go应用程序时是否可以自动递增次要版本号?
我想在自己的程序中设置一个版本号,用一个自动增量部分:
$ myapp -version MyApp version 0.5.132
0.5是我设置的版本号,132是每次二进制编译时自动递增的值。
这可能在Go吗?
Go链接器( 转到工具链接 )可以select设置未初始化的stringvariables的值:
-X importpath.name=value Set the value of the string variable in importpath named name to value. Note that before Go 1.5 this option took two separate arguments. Now it takes one argument split on the first = sign.
作为构build过程的一部分,您可以使用此设置版本stringvariables。 您可以使用-ldflags
将其传递给go
工具。 例如,给定以下源文件:
package main import "fmt" var xyz string func main() { fmt.Println(xyz) }
然后:
$ go run -ldflags "-X main.xyz=abc" main.go abc
为了将main.minversion
设置为build时的build立date和时间:
go build -ldflags "-X main.minversion=`date -u +.%Y%m%d.%H%M%S`" service.go
如果你编译时没有用这种方法初始化main.minversion
,它将包含空string。
在构build我的混合命令行应用程序和库项目时,使用-ldflags
参数时遇到了问题,所以我最终使用Makefile目标来生成包含我的应用程序版本和构builddate的Go源文件:
BUILD_DATE := `date +%Y-%m-%d\ %H:%M` VERSIONFILE := cmd/myapp/version.go gensrc: rm -f $(VERSIONFILE) @echo "package main" > $(VERSIONFILE) @echo "const (" >> $(VERSIONFILE) @echo " VERSION = \"1.0\"" >> $(VERSIONFILE) @echo " BUILD_DATE = \"$(BUILD_DATE)\"" >> $(VERSIONFILE) @echo ")" >> $(VERSIONFILE)
在我的init()
方法中,我这样做:
flag.Usage = func() { fmt.Fprintf(os.Stderr, "%s version %s\n", os.Args[0], VERSION) fmt.Fprintf(os.Stderr, "built %s\n", BUILD_DATE) fmt.Fprintln(os.Stderr, "usage:") flag.PrintDefaults() }
如果你想要一个自增的内部版本号而不是生成date,你可能需要创build一个包含最后版本号的本地文件。 你的Makefile会把文件内容读入一个variables,增加它,插入到version.go
文件中而不是date中,然后把新的内部版本号写回到文件中。
另外我想发一个小例子来说明如何使用git和makefile:
--- Makefile ---- # This how we want to name the binary output BINARY=gomake # These are the values we want to pass for VERSION and BUILD # git tag 1.0.1 # git commit -am "One more change after the tags" VERSION=`git describe --tags` BUILD=`date +%FT%T%z` # Setup the -ldflags option for go build here, interpolate the variable values LDFLAGS_f1=-ldflags "-w -s -X main.Version=${VERSION} -X main.Build=${BUILD} -X main.Entry=f1" LDFLAGS_f2=-ldflags "-w -s -X main.Version=${VERSION} -X main.Build=${BUILD} -X main.Entry=f2" # Builds the project build: go build ${LDFLAGS_f1} -o ${BINARY}_f1 go build ${LDFLAGS_f2} -o ${BINARY}_f2 # Installs our project: copies binaries install: go install ${LDFLAGS_f1} # Cleans our project: deletes binaries clean: if [ -f ${BINARY} ] ; then rm ${BINARY} ; fi .PHONY: clean install
make文件将创build两个可执行文件。 一个是执行function一个,另一个是function二作为主要条目:
package main import ( "fmt" ) var ( Version string Build string Entry string funcs = map[string]func() { "f1":functionOne,"f2":functionTwo, } ) func functionOne() { fmt.Println("This is function one") } func functionTwo() { fmt.Println("This is function two") } func main() { fmt.Println("Version: ", Version) fmt.Println("Build Time: ", Build) funcs[Entry]() }
然后运行:
make
你会得到:
mab@h2470988:~/projects/go/gomake/3/gomake$ ls -al total 2020 drwxrwxr-x 3 mab mab 4096 Sep 7 22:41 . drwxrwxr-x 3 mab mab 4096 Aug 16 10:00 .. drwxrwxr-x 8 mab mab 4096 Aug 17 16:40 .git -rwxrwxr-x 1 mab mab 1023488 Sep 7 22:41 gomake_f1 -rwxrwxr-x 1 mab mab 1023488 Sep 7 22:41 gomake_f2 -rw-rw-r-- 1 mab mab 399 Aug 16 10:21 main.go -rw-rw-r-- 1 mab mab 810 Sep 7 22:41 Makefile mab@h2470988:~/projects/go/gomake/3/gomake$ ./gomake_f1 Version: 1.0.1-1-gfb51187 Build Time: 2016-09-07T22:41:38+0200 This is function one mab@h2470988:~/projects/go/gomake/3/gomake$ ./gomake_f2 Version: 1.0.1-1-gfb51187 Build Time: 2016-09-07T22:41:39+0200 This is function two
使用多重-ldflags
:
$ go build -ldflags "-X name1=value1 -X name2=value2" -o path/to/output
在Windows操作系统给定下面的程序
package main import "fmt" var ( version string date string ) func main() { fmt.Printf("version=%s, date=%s", version, date) }
你可以使用构build
go build -ldflags "-X main.version=0.0.1 -X main.date=%date:~10,4%-%date:~4,2%-%date:~7,2%T%time:~0,2%:%time:~3,2%:%time:~6,2%"
date格式假定您的环境echo %date%
是Fri 07/22/2016
和echo %time%
是16:21:52.88
那么输出将是: version=0.0.1, date=2016-07-22T16:21:52