release的时候如何把我们的版本号打包到应用中

我们写代码的时候其实并不知道我们即将发布的版本是什么,而我们经常会使用tag或者使用git的commit来当做版本,而我们的程序也许有一个version的参数,那么如何在发布的时候动态的设定呢?
已邀请:

lgn21st - Ruby程序员,Web 应用和移动开发者,天天琢磨怎么减肥。

赞同来自: niugou

我见过其他很多项目通过一个专门用来打包的 go 程序文件来实现。

比如创建一个 build.go 的程序文件,在打包的时候执行 `go run build.go` 并在程序内可以解析出版本信息,tag,git commit 等信息并负责后续的编译打包工作。这个程序可以做的事情很多,比如解析命令行参数,系统调用,执行其他 shell 命令等等,最后结合 Makefile,通过 make 作为构建的执行入口。

astaxie - 创造、获取、分享、传播和应用Go

赞同来自: niugou

我们现在的做法是获取当前的tag和commit的信息作为版本

```
git describe --tags --dirty --always
```

然后赋值给在编译的时候通过`ldflags`设置version

```
go build -ldflags "-X main.version=$(VERSION)"
```

astaxie - 创造、获取、分享、传播和应用Go

赞同来自: xds2000

@xds2000 是的,=是Go1.6开始编译的时候给出的warning,后续版本可能就不支持空格分割了。

CurveSoft - 70后Go爱好者

赞同来自: HarveyZ

贴一段我之前的脚本吧


```bash
#!/bin/bash
RUN_MODE=develop
APP_NAME=wawazu-machine-server
SVC_NAME=$APP_NAME-$RUN_MODE
PRJ_PATH=/data/projects/$RUN_MODE/$APP_NAME
BIN_NAME=$APP_NAME-$RUN_MODE
RUN_PATH=/data/GORUN/$RUN_MODE/$APP_NAME

BUILDNO=`date '+%Y%m%d%H%M%S'`

mkdir -p $RUN_PATH

export GOROOT=/data/GO1.4.1
export GOPATH=/data/projects/develop/gopath-develop
export GOPATH=$GOPATH:$PRJ_PATH

cd $PRJ_PATH
$GOROOT/bin/go build -ldflags "-X main.BuildNumber=$BUILDNO" -o $PRJ_PATH/bin/$BIN_NAME "src/$APP_NAME.go"
cd $PRJ_PATH/bin
/usr/bin/supervisorctl stop $SVC_NAME
cp * $RUN_PATH -Rf
cd $RUN_PATH
/usr/bin/supervisorctl start $SVC_NAME

```
@astaxie 我记得之前的-X 语法是 key value,现在强制 key=value,请问,这有什么历史问题吗?
我们用的方法比较简单,我们用的是svn 直接将svn版本号写到一个文件的宏里,启动的时候把这个宏 打印到log里~~ 出问题的时候就可以查版本号对不对了

要回复问题请先登录注册